13

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

如何强制尾随零?

4

8 回答 8

29

1.4是一样的1.40- 你只是想以不同的方式显示它。调用时使用格式字符串ToString- 比如value.ToString("0.00")

于 2012-09-06T20:11:51.323 回答
14

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

.ToString("N2");
于 2012-09-06T20:11:35.940 回答
6

尾随零更多的是格式而不是值问题,因此请使用

foo.ToString("0.00")
于 2012-09-06T20:11:57.200 回答
6

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

我正在使用 ac# xml 类来填充然后序列化为 xml。其中一个值是双精度值。如果我为该值分配“7”,当我实际需要“7.00”时,它会被序列化为“7”。最简单的方法就是这样做:

foo = doubleValue + 0.00M

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

于 2017-05-04T19:15:37.380 回答
4

尾随零只是一个演示文稿。在数学方面,1.40并且1.4是等价的。

改用格式来显示小数点后 2 位:

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

or

yourNumber.ToString("0.00");
于 2012-09-06T20:12:27.157 回答
2

这与您使用小数还是双精度有关。

虽然在内部(从源代码中显示)Math.Round()即使在双精度数上也保留尾随零,但它在内存中保存为双精度的事实仍然会自动删除所有尾随零

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

同样,如果您有一个小数并且您不想要尾随零,只需将其转换为双精度(您可以将输入Math.Round或结果转换为,只要它在某处变成双精度就无关紧要了)。

于 2018-01-30T16:57:06.750 回答
1

它是一个数字(双精度?),因此它没有尾随零 - 您必须将其设为文本并强制尾随零。

于 2012-09-06T20:12:45.973 回答
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
于 2020-12-30T09:25:02.990 回答