【发布时间】:2012-06-23 03:09:47
【问题描述】:
我在几个地方看到它(int)someValue 不准确,而是调用round() 函数的问题。两者有什么区别?
特别是,如果需要,对于 C99 C。我在用 java 编写程序时也看到了同样的问题。
【问题讨论】:
-
我以前从未听说过的有趣的事情:“舍入到最接近的偶数是默认的 IEEE 舍入模式。” - randomascii.wordpress.com/2014/01/27/…
我在几个地方看到它(int)someValue 不准确,而是调用round() 函数的问题。两者有什么区别?
特别是,如果需要,对于 C99 C。我在用 java 编写程序时也看到了同样的问题。
【问题讨论】:
如果将float/double 值转换为int,由于整数截断,您通常会丢失小数部分。
这与我们通常期望的四舍五入完全不同,例如 2.8 以整数截断结束为 2,就像 2.1 以 2 结束一样。
更新:
另一个潜在(严重)不准确的来源是由于可以用整数而不是浮点类型表示的值范围有限(感谢@R在下面的评论中提醒我们这一点)
【讨论】:
round、floor、rint等函数可以做到这一点。
round() over cast 并不能解决这个“问题”(不是真的。它是一个特性)。我错过了什么吗?
int 会截断浮点数,也就是说,它会删除小数部分。 round 函数返回最接近的整数。中途大小写从零四舍五入,例如,round(-1.5) 是 -2,round(1.5) 是 2。 7.12.9.6 轮函数
概要
#include <math.h> double round(double x); float roundf(float x); long double roundl(long double x);说明
round函数将其参数四舍五入到最接近的值 浮点格式的整数值,中间取整 从零开始,无论当前舍入方向如何。退货
round函数返回四舍五入的整数值。
来源:C99 标准 (ISO/IEC 9899:1999)。这部分在 C11 标准中没有变化 (ISO/IEC 9899:2011)。
(有兴趣的朋友here是对舍入算法的清晰介绍。)
【讨论】:
round 不执行四舍五入(又名银行家四舍五入)。而不是幼稚的小学舍入从零开始舍入,这对于任何合法使用浮点算术来说几乎总是错误的事情。