Qui*_*ten 9 c# precision decimal decimal-point
我们有一个有趣的问题,我们需要确定用户输入(文本框)的小数精度.基本上我们需要知道输入的小数位数,然后返回一个精确数字,最好用例子说明:
输入4500将产生结果1
4500.1输入将产生结果0.1
4500.00输入将产生结果0.01
4500.450输入将产生结果0.001
我们正在考虑使用字符串,找到小数分隔符,然后计算结果.只是想知道是否有更简单的解决方案.
Dan*_*ner 16
我认为你应该按照你的建议 - 使用小数点的位置.明显的缺点可能是你必须自己考虑国际化.
var decimalSeparator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator;
var position = input.IndexOf(decimalSeparator);
var precision = (position == -1) ? 0 : input.Length - position - 1;
// This may be quite unprecise.
var result = Math.Pow(0.1, precision);
Run Code Online (Sandbox Code Playgroud)
您还可以尝试另一种方法 - Decimal类型存储内部精度值.因此,您可以使用Decimal.TryParse()并检查返回的值.也许解析算法保持输入的精度.
最后我建议不要使用浮点数来尝试.只是解析输入将删除有关尾随零的任何信息.所以你必须添加一个人工非零数字来保存它们或做类似的技巧.您可能会遇到精确问题.最后,基于浮点数找到精度也不简单.我看到一些丑陋的数学或一个循环乘以每次迭代十次,直到不再有任何小数部分.循环带来了新的精度问题......
UPDATE
解析成十进制的作品.Se Decimal.GetBits()详情.
var input = "123.4560";
var number = Decimal.Parse(input);
// Will be 4.
var precision = (Decimal.GetBits(number)[3] >> 16) & 0x000000FF;
Run Code Online (Sandbox Code Playgroud)
从这里开始使用Math.Pow(0.1, precision)是直截了当的.
cod*_*nix 11
只是想知道是否有更简单的解决方案.
没有.
使用字符串:
string[] res = inputstring.Split('.');
int precision = res[1].Length;
Run Code Online (Sandbox Code Playgroud)