代码之家  ›  专栏  ›  技术社区  ›  AGuyCalledGerald Omid.Hanjani

将数字字符串转换为四舍五入十进制(C)

  •  1
  • AGuyCalledGerald Omid.Hanjani  · 技术社区  · 7 年前

    很抱歉这个愚蠢的问题,但我从数据库中得到这个值

    "7.545720553985866E+29"
    

    我需要将这个值转换为十进制,四舍五入为6位。最好的方法是什么?我试过

    var test = double.Parse("7.545720553985866E+29");
    test = Math.Round(test, 6);
    var test2 = Convert.ToDecimal(test);
    

    但该值保持不变,转换将崩溃。

    3 回复  |  直到 7 年前
        1
  •  2
  •   D Stanley    7 年前

    Math.Round 四舍五入到N位数 小数点右边 . 您的数字在小数点右边没有数字(相当于 754,572,055,398,586,600,000,000,000,000 ,因此四舍五入不会更改值。

    如果你想转到N 有效数字 然后看看现有的一些答案:

    Round a double to x significant figures

    Rounding the SIGNIFICANT digits in a double, not to decimal places

    转换崩溃。

    这是因为值对于 decimal . 最大值A 十进制的 可以容纳是 7.9228E+28 -你的价值大约是这个的10倍。

        2
  •  0
  •   Mr.Deer    7 年前

    也许您可以将其子字符串化,然后解析。

    var test=“7.545720553985866E+29”.子串(0,8);//7.545720

    测试=数学四舍五入(测试,6);

    var test2=convert.todecimal(测试);

        3
  •  0
  •   Rory Daulton    7 年前

    您可以使用它将有效数字四舍五入到6位:

    round(test, 6 - int(math.log10(test)))
    

    由此得出的值是

    7.545721e+29
    

    这是通过使用 log10 从 math 获得10英寸电源的模块 test ,向下取整得到一个整数,从6中减去,然后使用 round 以获得所需的数字。

    正如其他人所指出的, 圆 工作到给定的小数位数。这个 登录10 其余的数字是需要多少个小数位才能得到所需的有效位数。如果小数位数为负数, 圆 舍入到小数点的左边。

    你应该知道 登录10 不完全准确 int 其中的一个可能与预期值相去甚远。这种情况很少发生,但确实发生了。此外,即使计算的值是正确的,将值转换为字符串(例如打印时)可能会产生不同于预期的结果。如果您需要完美的准确性,您最好使用值的字符串表示。