c# - 舍入 c# 给出错误答案

标签 c# .net math floating-point double

我正在为一个学校项目(自行车工厂)编写一个库存/生产程序,我必须将一些数字四舍五入,例如必须生产的自行车(由于后果,它是双倍的)。

如果我使用下面的代码:

double test = Math.Ceiling(100 * 1.09);

label75.Text = Convert.ToString(test);

我得到的答案是 110,但这是不对的,它应该是 109(100 的 9%)。尽管它似乎适用于低于 9% 的值。

我做错了什么?

最佳答案

doublefloat 是二进制浮点类型。这意味着它们不能精确表示许多十进制数字(如 1.09)。这会导致一些细微的舍入错误。在您的情况下,100 * 1.09 实际上会产生一个比 109 稍大的数字,因此 Ceiling 函数正确地将其四舍五入为最接近的整数 110。

将其更改为十进制,您将得到您期望的结果:

decimal test = Math.Ceiling(100 * 1.09m); // 109

请注意 1.09m 中的 m 将其标识为 decimal 文字。这是可行的,因为 decimal 类型专门设计用于表示十进制数(而不是像 doublefloat 那样只是它们的二进制近似值)。

关于c# - 舍入 c# 给出错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18751156/

相关文章:

c# - 如何知道 TriggerContext 当前更新的表?

c# - 在类中定义算术运算

c# Outlook 插件强行将光标移动到电子邮件正文的末尾

c# - ElasticSearch中的'and' 'Or'查询

c# - Convert.ToDateTime(D) 与 (DateTime)D 相比

c# - 两个字符串数组的交集(忽略大小写)

c# - CURL 到 WCF 的更好方法

.net - "Retrieving the COM class factory for component with CLSID {DB797690-40E0-11D2-9BD5-0060082AE372} failed due to the following error: 80040154."

algorithm - 计算数组 O(N) 中具有最大和的序列

java - Java 中的开源排队论算法