gpt4 book ai didi

c# - 确定输入数字的小数精度

转载 作者:可可西里 更新时间:2023-11-01 09:17:22 24 4
gpt4 key购买 nike

我们有一个有趣的问题是我们需要确定用户输入(文本框)的小数精度。本质上,我们需要知道输入的小数位数,然后返回一个精确数字,最好用示例来说明这一点:

输入4500会产生结果1
输入 4500.1 将产生结果 0.1
输入 4500.00 将产生结果 0.01
输入 4500.450 将产生结果 0.001

我们正在考虑使用字符串,找到小数点分隔符,然后计算结果。只是想知道是否有更简单的解决方案。

最佳答案

我认为你应该按照你的建议去做——使用小数点的位置。明显的缺点可能是您必须自己考虑国际化。

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);

您还可以尝试另一种方法 - Decimal 类型存储一个内部精度值。因此,您可以使用 Decimal.TryParse() 并检查返回值。也许解析算法保持了输入的精度。

最后我建议不要尝试使用 float 。仅解析输入将删除有关尾随零的任何信息。所以你必须添加一个人为的非零数字来保留它们或做类似的技巧。您可能会遇到精度问题。最后根据 float 找到精度也并不简单。我看到一些丑陋的数学或循环每次迭代都乘以 10,直到不再有任何小数部分。循环带来了新的精度问题......

更新

解析为十进制有效。有关详细信息,请参阅 Decimal.GetBits()

var input = "123.4560";

var number = Decimal.Parse(input);

// Will be 4.
var precision = (Decimal.GetBits(number)[3] >> 16) & 0x000000FF;

从这里开始使用 Math.Pow(0.1, precision) 很简单。

更新 2

使用 decimal.GetBits() 将分配一个 int[] 数组。如果您想避免分配,您可以使用以下辅助方法,该方法使用显式布局结构直接从十进制值中获取比例:

static int GetScale(decimal d)
{
return new DecimalScale(d).Scale;
}

[StructLayout(LayoutKind.Explicit)]
struct DecimalScale
{
public DecimalScale(decimal value)
{
this = default;
this.d = value;
}

[FieldOffset(0)]
decimal d;

[FieldOffset(0)]
int flags;

public int Scale => (flags >> 16) & 0xff;
}

关于c# - 确定输入数字的小数精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com