gpt4 book ai didi

c# - 如何将小数的最小小数部分加一?

转载 作者:太空狗 更新时间:2023-10-29 17:44:03 24 4
gpt4 key购买 nike

我想用一个增加小数的最小小数部分,例如

decimal d = 0.01
d++
d == 0.02

decimal d = 0.000012349
d++
d == 0.000012350

我该怎么做?

最佳答案

小数类型(.NET 2.0 及更高版本)保留重要的尾随零,这些零是计算结果或解析字符串的结果。例如。 1.2 * 0.5 = 0.60(两个数字相乘精确到小数点后一位,结果精确到小数点后两位,即使第二位小数为零):

decimal result = 1.2M * 0.5M;
Console.WriteLine(result.ToString()); // outputs 0.60

以下假设您要考虑十进制值中的所有有效数字,即

decimal d = 1.2349M;       // original  1.2349;
d = IncrementLastDigit(d); // result is 1.2350;
d = IncrementLastDigit(d); // result is 1.2351; (not 1.2360).

但是如果你想先删除尾随零,你可以这样做,例如使用技术 in this answer .

没有内置的东西可以做到这一点。您必须自己完成 (a) 确定小数点后有多少位数字,然后 (b) 添加适当的数量。

要确定小数点后有多少位数字,您可以将其格式化为字符串,然后对它们进行计数,或者更有效地调用 decimal.GetBits(),其结果是一个包含四个整数的数组,其中包含第 4 个整数的第 16-23 位的比例因子。

一旦你有了它,你就可以轻松地计算出所需的值以添加到你的十进制值。

这是一个使用 GetBits 的实现,对于负数 IncrementLastDigit(-1.234M) => -1.235M,它从零“递增”。

static decimal IncrementLastDigit(decimal value)
{
int[] bits1 = decimal.GetBits(value);
int saved = bits1[3];
bits1[3] = 0; // Set scaling to 0, remove sign
int[] bits2 = decimal.GetBits(new decimal(bits1) + 1);
bits2[3] = saved; // Restore original scaling and sign
return new decimal(bits2);
}

或者这里有一个替代方案(可能稍微更优雅):

static decimal GetScaledOne(decimal value)
{
int[] bits = decimal.GetBits(value);
// Generate a value +1, scaled using the same scaling factor as the input value
bits[0] = 1;
bits[1] = 0;
bits[2] = 0;
bits[3] = bits[3] & 0x00FF0000;
return new decimal(bits);
}

static decimal IncrementLastDigit(decimal value)
{
return value < 0 ? value - GetScaledOne(value) : value + GetScaledOne(value);
}

关于c# - 如何将小数的最小小数部分加一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2237130/

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