Math.Round不能保留小数点后的零

16

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

我该如何强制保留末尾的零?

8个回答

31

1.41.40 是相同的 - 只是展示方式不同。在调用 ToString 方法时,可以使用格式化字符串 - 如 value.ToString("0.00")


没错。我只是想以不同的方式显示它。谢谢! - Blade3

14

1.4 == 1.40 只有在将数字显示为字符串时,您才需要尾随0。

.ToString("N2");

6

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

foo.ToString("0.00")

6

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

我正在使用一个C#的XML类来填充并序列化到XML。其中一个值是double类型。如果我将'7'分配给该值,则在实际需要'7.00'时,它会被序列化为'7'。最简单的方法是执行以下操作:

foo = doubleValue + 0.00M

这会使得值变为7.00,而不仅仅是7。我认为这种方法比先将值转换为字符串再解析要好。


1
这将double转换为decimal。它们是非常不同的类型! - rianjs

5

末尾的零只是一种表现形式。在数学上,1.401.4是等价的。

使用格式化代替以2位小数形式呈现:

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

or

yourNumber.ToString("0.00");

2
它涉及到您使用十进制或双精度浮点数的问题。
虽然在内部(从源代码中可以看出),Math.Round()即使在双精度浮点数上也保留尾随零,但是保存为双精度浮点数会自动删除所有尾随零。
因此,如果您需要尾随零,可以使用字符串显示函数将其格式化,如其他人所答复的那样,或者确保将原始值作为十进制传递(导致在内部使用Decimal.Math.Round仅处理十进制数),并确保不将结果转换为双精度浮点数,也不要将其保存在双精度浮点数变量中。
同样,如果您有一个十进制数而不希望有尾随零,则将其转换为双精度浮点数(您可以将输入转换为Math.Round或结果,只要在某个地方它变成了双精度浮点数即可)。

1

这是一个数字(double?),所以它没有尾随零 - 你必须将其转换为文本并强制添加尾随零。


1
一个十进制数(不是双精度数)在内部保留了小数位数。 - NiKiZe

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接