确定输入数字的小数精度

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)

  • 要拆分的字符必须是正确的小数分隔符 - [NumberFormatInfo.NumberDecimalSeparator](http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.numberdecimalseparator.aspx) (16认同)

Hen*_*man 8

由于您的上一个示例表明尾随零是重要的,我将排除任何数值解决方案并进行字符串操作.