33

(int)someValue我已经在几个不准确的地方看到它,而是问题需要该round()功能。两者有什么区别?

具体来说,如果需要,对于 C99 C。我在用 java 编写程序时也看到了同样的问题。

4

2 回答 2

28

在将float/double值转换为 的情况下,由于整数截断int,您通常会丢失小数部分。

这与我们通常期望的舍入完全不同,因此例如 2.8 以整数截断结束为 2,就像 2.1 以 2 结束一样。

更新

强制转换的另一个潜在(严重)不准确的来源是由于能够用整数而不是浮点类型表示的值范围有限(感谢@R在下面的评论中提醒我们这一点)

于 2012-06-20T21:54:55.660 回答
15
  1. 强制转换为会int截断浮点数,也就是说,它会删除小数部分。
  2. round函数返回最接近的整数。中途情况从零四舍五入,例如round(-1.5)is-2round(1.5)is 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 )中没有变化。

(有兴趣可以看一下舍入算法的清晰介绍。)

于 2012-06-20T21:55:51.150 回答