首页 > 解决方案 > .NET C# float.Parse 返回不同的结果到 double.Parse

问题描述

一些更有经验的人可以解释我今天发现的这个奇怪的错误吗?当我用我的 C# 脚本加载表数据时,我得到了奇怪的数量。

事实证明,问题是类似函数的不同输出:

string amount_in_string = "1234567,15";
double amount_in_double = double.Parse(amount_in_string);
float amount_in_float = float.Parse(amount_in_string);

//amount_in_double = 1234567.15;
//amount_in_float = 1234567.13;

当 float 和 double 是相似类型(浮点)时,为什么我会得到如此不同的结果。像这样的少量精度可以产生影响吗?

标签: c#.nettypesfloating-pointprecision

解决方案


当“1234567.15”转换为double时,结果是 中可表示的最接近的值double,即 1234567.1499999999068677425384521484375。尽管您在问题中报告该值为 1234567.15,但实际值为 1234567.1499999999068677425384521484375。当值以有限的十进制数字显示时,将显示“1234567.15”。

当“1234567.15”转换为float时,结果为 中可表示的最接近的值float,即 1234567.125。虽然您报告的值为 1234567.13,但实际值为 1234567.125。当数值以有限的小数位数显示时,可能会显示“1234567.13”。


观察到 1234567 超过 1,048,576,即 2 20。用于的 32 位浮点格式float使用 24 位作为有效数(数字的小数部分)。如果有效数的高位表示 2 20,则低位表示 2 20-23 = 2 -3 = ⅛。这就是为什么您会看到“1234567.15”转换为四舍五入到最接近八分之一的值。


推荐阅读