【问题标题】:Rounding Decimal with no precision无精度舍入小数
【发布时间】:2015-03-01 08:23:24
【问题描述】:

我想将这个十进制数 14999994 舍入到这个值 15000000,但是 Math.Round() 不适合我!

请注意我的十进制数没有任何精度

【问题讨论】:

  • 数字1410000应该如何四舍五入?向下还是向上?
  • 14999994 到 15000000
  • 除、圆、乘
  • 您能否添加一些其他预期输出示例?例如 0.23 或 14432100.45 是什么?
  • 应该是14432100

标签: c# c#-4.0 rounding


【解决方案1】:
static double RoundToSignificantDigits(double d, int digits)
{
    if (d == 0)
    {
        return 0;
    }

    double scale = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(d))) + 1 - digits);
    return Math.Sign(d) * scale * Math.Ceiling(Math.Abs(d) / scale);
}

它基于基于Math.Log10(但请注意Math.Abs 为负数!)计算“比例”,减去给定的数字精度,然后将数字除以该“比例”,四舍五入并重新计算-乘以这个“比例”。请注意Math.Sign 的使用:我们将d 的绝对值四舍五入(Math.Ceiling),然后“重新附加”符号。

像这样使用它:

double n = RoundToSignificantDigits(14999994, 2); // 15000000 

请注意,double 是一只丑陋的野兽:

double num = 0.2;
num += 0.1; // 0.30000000000000004

double num2 = RoundToSignificantDigits(num, 1); // 0.4

【讨论】:

  • 嘿兄弟,我的号码是可变的,而不是静态的 14999994 只是一个例子!
  • 我问你:数字1410000应该如何四舍五入?向下还是向上?您将14999994回复到15000000
  • @franchescototti 立即尝试
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
相关资源
最近更新 更多