【问题标题】:How to properly round up doubles in C? [duplicate]如何在C中正确舍入双打? [复制]
【发布时间】:2019-11-28 13:56:25
【问题描述】:

出于某种原因,ceil(x) 将整数四舍五入为 x+1。

例如:

double og_grade = 50;
double fact_grade = ceil(og_grade*1.1);

og_grade*1.1 应该是 55.0000,但 ceil(og_grade*1.1) 返回 56.0000

请注意,og_grade 始终是一个整数。

【问题讨论】:

  • 你说 og_grade*1.1 == 55.0000.... - "...." 后面是什么?是 55.0000....01 吗?
  • @WillihamTotland:不,那是个坏方法。 Java 中有一个臭名昭著的舍入错误,直到版本 5 才被修复,该错误被归结为该方法。 ceilfloorround 出现在 C 标准库中是有充分理由的。
  • 55*1.1 结果为55.00000000000000710542735760100185871124267578125,因此ceil 返回56 是正确的。 ideone.com/74a7IE
  • @mch,假设 IEEE754 double
  • @Hanik:要解决此问题,请考虑修改您的代码以使用整数或fixed point arithmetic。浮点数学很适合科学计算,但否则会很糟糕;例如,您永远不应该尝试使用浮点数学来表示货币。

标签: c variables rounding


【解决方案1】:

我尝试了 ceil(x) 函数,但由于某种原因,x 已经在 舍入,它向上舍入到 x+1

不,这意味着ceil 的实现有缺陷。不是不可能,但不可能。

很可能观察到此效果的x 实际上不是整数,并且在格式化或调试器中省略了小数部分。

假设 IEEE754,最接近 double 到 1.1 的值略大;这很可能说明了您的结果。

在您的情况下,鉴于op_grade 实际上是一个整数,您最好的办法是使用int 代替op_grade,然后乘以11;随后的四舍五入检查既简单又精确。

【讨论】:

  • 简而言之,我的任务是获得一个成绩并以 10% 的额外成绩返还,并且总是四舍五入。如果是 60.5,则返回 61。如果是 55,则返回 55。如果结果大于 100,则应返回 100。我尝试返回原始成绩乘以 1.1 的 ceil()。所有非常基本的东西,但我一直在为这个问题发疯。最好的执行方式是什么?
  • @Hanik:og_grade 总是一个整数吗?
  • 是的,fact_grade 在四舍五入后应该是这样。
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 2014-11-22
  • 2014-05-16
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2020-02-29
  • 2011-08-23
相关资源
最近更新 更多