C# 数学给出了错误的结果!

标签 c# math floating-point division

我理解这个问题背后的原理,但想到这在我的整个应用程序中都在发生,我需要找到解决方案,这让我很头疼。

double Value = 141.1;
double Discount = 25.0;
double disc = Value * Discount / 100; // disc = 35.275
Value -= disc; // Value = 105.824999999999999

Value = Functions.Round(Value, 2); // Value = 105.82

我使用 double 来表示非常小的数字。不知何故,在计算 141.1 - 35.275 中,结果的二进制表示给出了一个数字,该数字仅为 0.0000000000001。不幸的是,由于我随后四舍五入这个数字,所以给出了错误的答案。

我读过有关使用 Decimals 而不是 Double 的信息,但我无法将 Double 的每个实例都替换为 Decimal。有没有更简单的方法来解决这个问题?

最佳答案

如果您正在寻找自然为十进制的值的精确表示,您需要在所有地方将double 替换为decimal。您只是使用了错误的数据类型。如果您一直对整数使用 short,然后发现您需要处理比其支持的更大的值,您会怎么做?这是一样的交易。

但是,您真的应该尝试了解正在发生的事情...例如,为什么 Value 不正好等于 141.1。

我有两篇关于此的文章:

关于C# 数学给出了错误的结果!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5179452/

相关文章:

c# - 您的项目未引用 ".NETFramework,Version=v4.6.2"框架。在 ".NETFramework,Version=v4.6.2"中添加对 "TargetFrameworks"的引用

c# - 如何将枚举保存到 ApplicationData.Current.LocalSettings

c++ - SDL2 填充圆 - 相同的操作,不同的结果

c++ - 如何使用cout以全精度打印 double 值?

mysql - 无法对浮点值实现 WHERE 子句

c# - 文本框文本作为 c# 中电子邮件的 html

c# - Selenium 与 .net core : performance impact, IWebElement 中的多个线程?

mysql - MySQL 中的反向测试版

algorithm - 所需的最少操作数

c - float 和 double 数据类型在 gcc 编译器中工作吗?