现在我知道使用 float.Parse 的方法,但遇到了问题。
我正在解析字符串“36.360”,但是解析后的浮点数变为 36.3600006103516。
我是否可以安全地将其四舍五入到小数点后 3 位,或者是否有更好的策略来解析字符串中的浮点数。
显然,我正在寻找解析后的浮点数为 36.360。
这与解析无关,而是浮点数的固有“特征”。许多具有精确十进制表示的数字不能精确地存储为浮点数,从而导致出现这种不等式。
维基百科(网络上的许多文章)解释了这些问题。
浮点数天生就容易出现舍入错误;即使是不同的 CPU 架构也会在百万分之一位及以上给出不同的数字。==
这也是为什么在比较浮点数时 不能使用的原因......由于浮点精度错误,它们很少会评估为相等。
浮点数的精度是有限制的。查看此链接以获取更多详细信息。
如果您需要更精确的跟踪,请考虑使用类似 adouble
或decimal
类型的东西。
这是由于以下事实float
或double
两者都以这样一种方式存储,即从内存中读取值是一个数学过程。如果您想将该值存储为实际值,则更好的选择是decimal
.
Decimal 值类型适用于需要大量有效整数和小数位数且无舍入错误的财务计算。Decimal 类型不会消除舍入的需要。相反,它最大限度地减少了由于四舍五入引起的错误。
这根本不是一个奇怪的问题,它只是你总会遇到的花车的迷人特征之一。浮点数不能准确表达那种十进制值!
因此,如果您需要结果恰好是36.36,请使用 adecimal
而不是 a float
。
否则,你可以自由地四舍五入。请注意,四舍五入也无济于事,因为四舍五入后也不会完全是 36.36。