Math.Round不保持尾随零

时间:2012-09-06 20:09:42

标签: c# rounding

我需要将所有值四舍五入到小数点后两位。因此1.401应该舍入到1.40,但是Math.Round(value, 2)舍入到1.4。

如何强制尾随零?

8 个答案:

答案 0 :(得分:23)

1.41.40相同 - 您只想以不同方式显示它。在致电ToString时使用格式字符串 - 例如value.ToString("0.00")

答案 1 :(得分:14)

1.4 == 1.40唯一一次需要尾随0的时候就是显示数字...时间。将其格式化为字符串。

.ToString("N2");

答案 2 :(得分:8)

我知道这是一个老问题,但可能对某人有帮助!

我使用c#xml类填充然后序列化为xml。其中一个值是双倍的。如果我为该值指定一个'7',那么当我实际需要'7.00'时,它会被序列化为'7'。最简单的方法就是这样做:

foo = doubleValue + 0.00M

这使得值7.00而不是7.认为这比做ToString然后解析它更好。

答案 3 :(得分:5)

尾随零的格式多于值问题,因此请使用

foo.ToString("0.00")

答案 4 :(得分:3)

尾随零只是一个演示文稿。数学方面,1.401.4是等价的。

使用格式代替将其显示为2位小数:

String.Format("{0:0.00}", 1.4);

or

yourNumber.ToString("0.00");

答案 5 :(得分:1)

这是一个数字(双?),所以它没有尾随零 - 你必须使它成为文本并强制尾随零。

答案 6 :(得分:0)

它与您使用小数还是双倍有关。

虽然内部(从Source Code显示)Math.Round()保留了尾随零,即使是双精度,仍然是它在内存中保存为double的事实会导致自动删除所有尾随零

因此,如果您确实需要拖尾零,您可以使用字符串显示函数来格式化其他人已经回答的格式,或者确保将原始值作为小数传递(导致在内部使用Decimal.Math.Round将仅处理小数),并确保不将结果转换为double,也不将其保存在double变量中。

类似地,如果你有一个小数而且你不想要尾随零,只需将其转换为双精度(你可以将输入转换为Math.Round或结果,只要在某个地方就没关系在它变成双重的方式。)

答案 7 :(得分:0)

你可以使用这个函数代替round,就像你使用round函数一样使用它。

import decimal

def printf(x, n):
    d = decimal.Decimal(str(x))
    d0 = -(d.as_tuple().exponent)
    if d0 < n:
        print("x = ", x)
    else:
        d1 = decimal.Decimal(str(round(x, n)))
        d2 = d1.as_tuple().exponent
        MAX = n + d2
        if MAX == 0:
            print("x = ", round(x, n))
        else:
            i = 0
            print("x = ", round(x, n), end = '')
            while i != MAX:
                if i == (MAX - 1):
                    print("0")
                else:
                    print("0", end = '')
                i = i + 1

所以你一定有这样的东西。

>>> printf(0.500000000000001, 13)
>>> 0.5000000000000