c# - .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 是相似类型(浮点)时,为什么我会得到如此不同的结果。像这样的少量精度可以产生影响吗?
解决方案
当“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”转换为四舍五入到最接近八分之一的值。
推荐阅读
- c# - 如何将 gridview(wpf) 导出到 csv ?我知道解决方案,但我只得到标题作为输出?
- css - CSS 在我的 WordPress 博客主页上不起作用
- django - 在不使用 Relay 的情况下对石墨烯查询使用 django_filters
- rust - 实现读取特征:特征绑定`std::error::Error + 'static: std::marker::Sized`不满足
- redirect - Symfony 4 使用语言环境
- apache-flink - Apache Flink 1.3.2 与 Kafka 1.1.0 的连接问题
- c++ - PCL 读取 PLY 错误
- java - Apache PdfBox,如何检查页面上的可用空白空间
- c# - Oracle.ManagedDataAccess.dll 中发生了“OracleInternal.NotificationServices.ONSException”类型的第一次机会异常
- magento2 - 如何在结帐页面中将应用优惠券移动到 Magento 2 的侧栏?