我想将一个数字缩短到第一个不为 0 的有效数字。后面的数字应该四舍五入。
例子:
0.001 -> 0.001
0.00367 -> 0.004
0.00337 -> 0.003
0.000000564 -> 0.0000006
0.00000432907543029 -> 0.000004
目前我有以下流程:
if (value < (decimal) 0.01)
{
value = Math.Round(value, 4);
}
注意:
- 数字永远是正数
- 有效位数永远为1
- 大于 0.01 的值将始终四舍五入到小数点后两位,因此 if < 0.01
从上面的示例可以看出,四舍五入到小数点后 4 位可能不够,而且值可能相差很大。
最佳答案
我会声明 precision
变量并使用迭代将该变量乘以 10
与它没有命中的原始值,即 precision
将添加 1
。
然后使用 precision
变量作为 Math.Round
第二个参数。
我对方法进行了一些修改,不仅可以支持零小数点,还可以支持所有十进制数。
static decimal RoundFirstSignificantDigit(decimal input) {
if(input == 0)
return input;
int precision = 0;
var val = input - Math.Round(input,0);
while (Math.Abs(val) < 1)
{
val *= 10;
precision++;
}
return Math.Round(input, precision);
}
我会为这个功能写一个扩展方法。
public static class FloatExtension
{
public static decimal RoundFirstSignificantDigit(this decimal input)
{
if(input == 0)
return input;
int precision = 0;
var val = input - Math.Round(input,0);
while (Math.Abs(val) < 1)
{
val *= 10;
precision++;
}
return Math.Round(input, precision);
}
}
然后像这样使用
decimal input = 0.00001;
input.RoundFirstSignificantDigit();
结果
(-0.001m).RoundFirstSignificantDigit() -0.001
(-0.00367m).RoundFirstSignificantDigit() -0.004
(0.000000564m).RoundFirstSignificantDigit() 0.0000006
(0.00000432907543029m).RoundFirstSignificantDigit() 0.000004
关于c# - 将小数四舍五入到第一个不为零的小数位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52440913/