主页C++ Builder 资料C++ Builder 参考手册cmath 数学函数round, roundf, roundl
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
cfloat 浮点数
cmath 数学函数
 • acos, acosf, acosl
 • acosh, acoshf, acoshl
 • asin, asinf, asinl
 • asinh, asinhf, asinhl
 • atan, atanf, atanl
 • atan2, atan2f, atan2l
 • atanh, atanhf, atanhl
 • ceil, ceilf, ceill
 • copysign, copysignf, copysignl
 • cos, cosf, cosl
 • cosh, coshf, coshl
 • exp, expf, expl
 • exp2, exp2f, exp2l
 • expm1, expm1f, expm1l
 • fabs, fabsf, fabsl
 • floor, floorf, floorl
 • fmod, fmodf, fmodl
 • frexp, frexpf, frexpl
 • hypot, hypotf, hypotl
 • ldexp, ldexpf, ldexpl
 • log, logf, logl
 • log10, log10f, log10l
 • log1p, log1pf, log1pl
 • log2, log2f, log2l
 • modf, modff, modfl
 • nan, nanf, nanl
 • poly, polyl
 • pow, powf, powl
 • pow10, pow10l
 • round, roundf, roundl
 • sin, sinf, sinl
 • sinh, sinhf, sinhl
 • sqrt, sqrtf, sqrtl
 • tan, tanf, tanl
 • tanh, tanhf, tanhl
 • trunc, truncf, truncl
 • _exception, _exceptionl
 • _matherr, _matherrl
 • HUGE_VAL, HUGE_VALF, HUGE_VALL, _LHUGE_VAL
 • EDOM, ERANGE
 • _mexcep, DOMAIN, SING, OVERFLOW, UNDERFLOW, TLOSS, PLOSS, STACKFAULT
 • M_E, M_LOG2E, M_LOG10E, M_LN2, M_LN10
 • M_PI, M_PI_2, M_PI_4, M_1_PI, M_2_PI, M_1_SQRTPI, M_2_SQRTPI
 • M_SQRT2, M_SQRT_2
 • DOMAIN error 定义域错误
cstdlib 标准库函数
System 字符串
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
round, roundf, roundl - 四舍五入取整,求最接近 x 的整数

函数原型:

函数原型 C90 C99 C++98 C++11
double round(double x);    
float roundf(float x);      
long double roundl(long double x);      
float round(float x);      
long double round(long double x);      

头文件:

#include <cmath>

命名空间:

std

参数:

x:浮点数

返回值:

取整之后的浮点数,是一个最接近 x 的整数值,从坐标轴上看,返回值是与 x 重合或在 x 的两侧与 x 距离最近的整数,
如果有两个整数和 x 的距离相等,即 x 的小数部分正好等于 0.5 的时候,取绝对值大的那个整数,
从字面上看,就是 “四舍五入”,只要小数点后面第一位数字是 5 或者大于 5 就进位,小于 5 就舍去。

std::round 与 System::Math::RoundTo 函数的区别,在有两个整数和 x 的距离相等的时候:
 • round 取绝对值大的整数,即 “四舍五入”;
 • RoundTo 取偶数,即 “四舍六入五成双”,称为 Banker's Rounding 规则 (五后有数入、五后无数凑偶数);

根据上面的图形可以看到:传统的 “四舍五入” 会让数量非常大的数据计算之后偏大,因为两端距离相等的时候始终选择绝对值大的,而 “四舍六入五成双” 的 Banker's Rounding 规则会让数据两端取舍的概率均等,因为对于不同的数值,偶数可能在左边,也可能在右边,计算之后的数据不会明显偏大或偏小,所以更推荐使用 System::Math::RoundTo 函数。看下面的例子对取舍规则会有更详细的了解。

例子:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  const wchar_t fmt[] = L"%6.2f %6.2f %6.2f %6.2f %6.2f %6.2llf\r\n";
  UnicodeString s = L" value  trunc  floor   ceil  round  RoundTo\r\n";
  s.cat_sprintf(fmt,  5.4 , trunc( 5.4 ), floor( 5.4 ), ceil( 5.4 ), round( 5.4 ), RoundTo( 5.4 ,0));
  s.cat_sprintf(fmt,  5.5 , trunc( 5.5 ), floor( 5.5 ), ceil( 5.5 ), round( 5.5 ), RoundTo( 5.5 ,0));
  s.cat_sprintf(fmt,  6.5 , trunc( 6.5 ), floor( 6.5 ), ceil( 6.5 ), round( 6.5 ), RoundTo( 6.5 ,0));
  s.cat_sprintf(fmt,  6.51, trunc( 6.51), floor( 6.51), ceil( 6.51), round( 6.51), RoundTo( 6.51,0));
  s.cat_sprintf(fmt,  6.8 , trunc( 6.8 ), floor( 6.8 ), ceil( 6.8 ), round( 6.8 ), RoundTo( 6.8 ,0));
  s.cat_sprintf(fmt, -5.4 , trunc(-5.4 ), floor(-5.4 ), ceil(-5.4 ), round(-5.4 ), RoundTo(-5.4 ,0));
  s.cat_sprintf(fmt, -5.5 , trunc(-5.5 ), floor(-5.5 ), ceil(-5.5 ), round(-5.5 ), RoundTo(-5.5 ,0));
  s.cat_sprintf(fmt, -6.5 , trunc(-6.5 ), floor(-6.5 ), ceil(-6.5 ), round(-6.5 ), RoundTo(-6.5 ,0));
  s.cat_sprintf(fmt, -6.51, trunc(-6.51), floor(-6.51), ceil(-6.51), round(-6.51), RoundTo(-6.51,0));
  s.cat_sprintf(fmt, -6.8 , trunc(-6.8 ), floor(-6.8 ), ceil(-6.8 ), round(-6.8 ), RoundTo(-6.8 ,0));
  Memo1->Lines->Text = s;
}

兼容性:

round, roundf, roundl 是一组 C++ 11 新标准函数,在 C++ Builder 里面可以使用 System::Math::RoundTo 函数替代,虽然有细微的差别,而且在实际应用当中,更推荐使用 “四舍六入五成双” 的 Banker's Rounding 规则的 System::Math::RoundTo 函数。

函数 \ C++ Builder 编译器 bcc32 clang32 clang64
round   版本 ≥ 10.2 Tokyo Update 1
roundf   版本 ≥ 10.2 Tokyo Update 1
roundl   版本 ≥ 10.2 Tokyo Update 1

相关链接:

ceilfloortruncRoundTo_matherr浮点数异常处理

◤上一页:pow10, pow10l下一页:sin, sinf, sinl

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号