【问题标题】:cast variable to int vs round() function将变量转换为 int vs round() 函数
【发布时间】:2012-06-23 03:09:47
【问题描述】:

我在几个地方看到它(int)someValue 不准确,而是调用round() 函数的问题。两者有什么区别?

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

【问题讨论】:

标签: c int rounding


【解决方案1】:

如果将float/double 值转换为int,由于整数截断,您通常会丢失小数部分。

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

更新

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

【讨论】:

  • 我不明白为什么这些问题集(比赛或哈佛大学的在线cs50)使用round()并告诉学生专门使用int,以便他们向下。你不觉得这很烦人吗?无论如何,谢谢你。
  • 转换或隐式转换为整数的另一个问题是大数值被破坏。即使您想要整数结果,通常最好保留浮点类型,以便保留大数量的数字。 roundfloorrint等函数可以做到这一点。
  • @r 优秀点,能够表示的数值范围肯定是用整数来限制的。我想我会在我的答案中添加一个关于这个的注释。谢谢。
  • @R.. - 绝对正确的观点,但它与主题有什么关系?使用round() over cast 并不能解决这个“问题”(不是真的。它是一个特性)。我错过了什么吗?
【解决方案2】:
  1. 强制转换为int 会截断浮点数,也就是说,它会删除小数部分。
  2. round 函数返回最接近的整数。中途大小写从零四舍五入,例如,round(-1.5)-2round(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是对舍入算法的清晰介绍。)

【讨论】:

  • 请注意,舍入行为可能与预期和语言不同。例如,我最近发现 Python 3.x 向最接近的 even 数舍入 .. 这真的让我大吃一惊。因此,检查文档总是好的。我相信从我的 C 编程时代开始,C 的行为更符合普遍的期望。
  • 是的,我也很惊讶。它被称为“银行家四舍五入”。
  • x86 中的标准 load-float 指令也会舍入而不是截断。您必须更改 FPU 的舍入模式才能获得 C 所需的行为。
  • round 不执行四舍五入(又名银行家四舍五入)。而不是幼稚的小学舍入从零开始舍入,这对于任何合法使用浮点算术来说几乎总是错误的事情。
  • @R.. 我包含了 C99 标准中的圆函数规范。它清楚地说明了回合应该做什么。
猜你喜欢
  • 2017-07-05
  • 1970-01-01
  • 2012-09-02
  • 2020-07-24
  • 1970-01-01
  • 2023-04-08
  • 2019-12-03
  • 2019-07-04
  • 1970-01-01
相关资源
最近更新 更多