作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想用一个增加小数的最小小数部分,例如
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/
我是一名优秀的程序员,十分优秀!