我需要将所有值都舍入到小数点后两位。因此,1.401应该舍入为1.40,但是Math.Round(value, 2)
会舍入为1.4。
我该如何强制保留末尾的零?
1.4
和 1.40
是相同的 - 只是展示方式不同。在调用 ToString
方法时,可以使用格式化字符串 - 如 value.ToString("0.00")
1.4 == 1.40
只有在将数字显示为字符串时,您才需要尾随0。
.ToString("N2");
结尾的零更多是一个格式问题而不是一个值问题,因此请使用
foo.ToString("0.00")
我知道这是一个老问题,但可能会有所帮助!
我正在使用一个C#的XML类来填充并序列化到XML。其中一个值是double类型。如果我将'7'分配给该值,则在实际需要'7.00'时,它会被序列化为'7'。最简单的方法是执行以下操作:
foo = doubleValue + 0.00M
这会使得值变为7.00,而不仅仅是7。我认为这种方法比先将值转换为字符串再解析要好。
double
转换为decimal
。它们是非常不同的类型! - rianjs末尾的零只是一种表现形式。在数学上,1.40
和1.4
是等价的。
使用格式化代替以2位小数形式呈现:
String.Format("{0:0.00}", 1.4);
or
yourNumber.ToString("0.00");
Math.Round()
即使在双精度浮点数上也保留尾随零,但是保存为双精度浮点数会自动删除所有尾随零。Decimal.Math.Round
仅处理十进制数),并确保不将结果转换为双精度浮点数,也不要将其保存在双精度浮点数变量中。Math.Round
或结果,只要在某个地方它变成了双精度浮点数即可)。这是一个数字(double?),所以它没有尾随零 - 你必须将其转换为文本并强制添加尾随零。
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