gpt4 book ai didi

c# - 将小数四舍五入到第一个不为零的小数位

转载 作者:IT王子 更新时间:2023-10-29 04:43:51 28 4
gpt4 key购买 nike

我想将一个数字缩短到第一个不为 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();

c# online

结果

(-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/

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