jul*_*old 19 .net c# math decimal rounding
我想将一个数字缩短为非0的第一个有效数字.后面的数字应该是四舍五入的.
例子:
0.001 -> 0.001
0.00367 -> 0.004
0.00337 -> 0.003
0.000000564 -> 0.0000006
0.00000432907543029 -> 0.000004
Run Code Online (Sandbox Code Playgroud)
目前我有以下程序:
if (value < (decimal) 0.01)
{
value = Math.Round(value, 4);
}
Run Code Online (Sandbox Code Playgroud)
注意:
从上面的示例中可以看出,舍入到4个小数位可能不够,值可能会有很大差异.
D-S*_*hih 17
我会声明precision变量并使用迭代将该变量乘以10它没有命中的原始值,这precision将添加1.
然后使用precision变量是Math.Round第二个参数.
static decimal RoundFirstSignificantDigit(decimal input) {
int precision = 0;
var val = input;
while (Math.Abs(val) < 1)
{
val *= 10;
precision++;
}
return Math.Round(input, precision);
}
Run Code Online (Sandbox Code Playgroud)
我会为这个函数编写一个扩展方法.
public static class FloatExtension
{
public static decimal RoundFirstSignificantDigit(this decimal input)
{
int precision = 0;
var val = input;
while (Math.Abs(val) < 1)
{
val *= 10;
precision++;
}
return Math.Round(input, precision);
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用喜欢
decimal input = 0.00001;
input.RoundFirstSignificantDigit();
Run Code Online (Sandbox Code Playgroud)
结果
(-0.001m).RoundFirstSignificantDigit() -0.001
(-0.00367m).RoundFirstSignificantDigit() -0.004
(0.000000564m).RoundFirstSignificantDigit() 0.0000006
(0.00000432907543029m).RoundFirstSignificantDigit() 0.000004
Run Code Online (Sandbox Code Playgroud)