一个关于Round函数的问题

本文详细介绍了Delphi中Round函数的工作原理,解释了其遵循的四舍六入五成双(银行家算法),并提供了具体示例。此外,还讨论了如何实现传统四舍五入方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Round函数(四舍六入五成双)
2008-10-29 15:27

Round(所在单元:Math)
  功能说明:对一个实数进行四舍五入。(按照银行家算法)
  参考实例:
  var
    I, j: Integer;
  begin
    i := Round(1.5); // i等于2
    j := Round(2.5); // j等于2
             //注意Round(2.53)=3
  end;

在Delphi中使用Round函数得到的答案有时与我们所预期的会不太一样:
采用的是四舍六入五留双。即当舍或入位大于或小于五时按四舍五入来处理,而当舍或入位等于五时,就要看前面一位是什么,根据奇进偶不进,它总是返回一个偶数值。
        示例                结果
i:= Round(11.5)           12
i:= Round(10.5)           10

          这种Round其实是按照银行家算法,统计学上一般都用这种算法,比传统的"四舍五入"要科学。
如果要使用传统的"四舍五入"方法,可以使用下面算法:

//提供者FlashDance(10040231) 15:15:58
var
D1,D2:Double;
begin
     D1:=3.14159;
     D2:=StrToFloat(Format('%.5f',[D1]));
end;

另一篇文章:

Math.Round(double,int)採用的是四舍六入五考慮的方法

msdn并没有详细的说明清楚,给了一个例子;

Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4.
Math.Round(3.46, 1); //Returns 3.5.

依照他的例子得到的是"五舍六入",我改变了一下数字得到的结果将完全改变。

Math.Round(3.445, 1); //Returns 3.4.
Math.Round(3.455, 1); //Returns 3.5.
Math.Round(3.465, 1); //Returns 3.5.

Math.Round(3.450, 1); //Returns 3.4.(补0是无效的)

Math.Round(3.4452, 2); //Returns 3.45.
Math.Round(3.4552, 2); //Returns 3.46.
Math.Round(3.4652, 2); //Returns 3.47.

答:
世界上的许多国家已广泛采用“四舍六入法”。我国国家科委于1955年就作了推荐。“四舍 六入法”可以概括为:“四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一。”
答:
在工程技术、金融和科学领域,我们往往认为将一个小数圆整到距离它最近的偶数(而并非总是将它向上圆整)更加精确,即我们在此所说的“四舍六入”法。
Math.Round()方法使用的银行家算法的依据,是IEEE Standard 754这个国际标准

据说欧洲银行全采用这个模式
这个都不知道,四舍六入五成双,Round都是这样处理的。
我也遇到过这个问题,起初也很奇怪,后来看了帮助,果然是四舍六入五靠偶,虽然楼上的所说的四舍六入是国际标准,但是中国的很多业务系统还是采取的是四舍五入的方法,没办法,我只好自己写了个方法来四舍五入了。不过网上有一个不错的方法,虽然有取巧嫌疑,但是一般没什么问题,就是在后面加上0.0000000001,很小的一个数,这时再来取两位,三位或四位就基本没问题了。可以试试

<think>好的,我现在需要帮助用户了解COUNT和ROUND函数的用法及区别。首先,我得先回忆一下这两个函数的基本功能,然后结合提供的引用内容来组织答案。用户提到了三个引用,其中引用[1]和[3]详细讲解了COUNT函数,引用[2]提到了MAX和MIN,但引用[3]还涉及ROUND函数以及SUM与COUNT的区别。虽然用户的问题是关于COUNT和ROUND的,但需要确保正确区分它们的用法。 首先,COUNT函数主要用于统计行数。根据引用[1],COUNT可以接受不同的参数,比如列名、表达式或*,并且可以使用ALL或DISTINCT关键字。同时,引用[1]还提到在条件表达式中使用OR NULL或者IF、CASE WHEN来处理条件统计的情况。例如,COUNT(number > 200 OR NULL)实际上是统计满足number>200的行数,因为当条件不满足时,表达式结果为NULL,而COUNT会忽略NULL值。 引用[3]补充了COUNT和SUM的区别,特别是当参数是列名时,COUNT统计的是非NULL的行数,而SUM则是计算列值的总和。同时,COUNT(*)会统计所有行,包括NULL值,而SUM(1)相当于统计行数,但COUNT(1)更常见。 接下来是ROUND函数。根据引用[3],ROUND用于数值的四舍五入,语法是ROUND(number, decimals)。需要说明参数的含义,比如decimals表示保留的小数位数,可以为负数,这时会舍入到整数位。例如,ROUND(123.456, 1)得到123.5,ROUND(123.456, -2)得到100。 现在要区分COUNT和ROUND的区别。COUNT是聚合函数,用于统计行数,处理的是数据的计数;而ROUND是数值函数,用于处理数值的格式,两者在功能和应用场景上有明显不同。需要举例说明,比如COUNT的结果是整数,而ROUND的结果是四舍五入后的数值。 用户可能还希望看到实际的应用示例,比如在同一个查询中同时使用COUNT和ROUND,例如计算平均销售额并四舍五入到两位小数。这时候需要结合AVG函数ROUND函数,而COUNT用于统计订单数量。 需要确保回答结构清晰,分点说明每个函数的用法,然后比较它们的区别。同时,根据用户提供的引用内容,适当添加引用标记,比如在解释COUNT的条件表达式时引用[1],在讨论COUNT与SUM的区别时引用[3],以及在ROUND函数部分引用[3]。 可能需要注意的误区是用户可能会混淆COUNT和SUM,但用户的问题是关于COUNT和ROUND,所以主要区分这两个。同时,确保语法正确,比如在示例中使用正确的SQL语句,使用反引号包裹代码块。 最后,生成相关问题时要围绕这两个函数,可能涉及它们的常见使用场景、与其他函数的结合使用、性能考虑等。</think>### COUNT函数ROUND函数的用法及区别 #### 一、COUNT函数详解 1. **基础功能** COUNT函数用于统计**非NULL值**的行数,支持以下语法: - `COUNT(*)`:统计所有行数(包括NULL值)[^3] - `COUNT(column)`:统计指定列中非NULL值的行数 - `COUNT(DISTINCT column)`:统计列中唯一非NULL值的数量[^1] ```sql -- 统计总订单数 SELECT COUNT(*) FROM orders; -- 统计客户表中非空的邮箱数量 SELECT COUNT(email) FROM customers; -- 统计商品表中唯一的分类数量 SELECT COUNT(DISTINCT category) FROM products; ``` 2. **条件统计** 结合条件表达式时,需注意**NULL处理**(条件不满足时返回NULL,COUNT自动忽略)[^1]: ```sql -- 统计价格超过100的商品数量(三种等效写法) SELECT COUNT(price > 100 OR NULL) FROM products; SELECT COUNT(IF(price > 100, 1, NULL)) FROM products; SELECT COUNT(CASE WHEN price > 100 THEN 1 END) FROM products; ``` --- #### 二、ROUND函数详解 1. **基础功能** ROUND函数用于对数值进行**四舍五入**,语法为: $$ \text{ROUND}(number, decimals) $$ - `number`:待处理的数值 - `decimals`:保留小数位数(可为负数,表示整数位舍入)[^3] ```sql -- 四舍五入保留两位小数 SELECT ROUND(123.4567, 2); -- 结果: 123.46 -- 四舍五入到十位 SELECT ROUND(123.4567, -1); -- 结果: 120 ``` 2. **特殊场景** - 若`decimals`为0或省略,默认取整数: ```sql SELECT ROUND(123.456); -- 结果: 123 ``` - 处理负数的舍入: ```sql SELECT ROUND(-12.34, 1); -- 结果: -12.3 ``` --- #### 三、核心区别对比 | 特性 | COUNT | ROUND | |--------------------|----------------------------------|------------------------| | **功能定位** | 聚合函数(统计行数) | 数值函数(格式化数值) | | **输入类型** | 任意数据类型(统计非NULL行数) | 仅数值类型 | | **输出类型** | 整数 | 数值(可能含小数) | | **典型应用场景** | 统计数量、去重计数、条件计数 | 金额/测量值精确化 | --- #### 四、联合使用示例 ```sql -- 计算平均销售额(四舍五入保留2位小数) SELECT COUNT(*) AS order_count, ROUND(AVG(amount), 2) AS avg_amount FROM sales; ``` > 此查询中: > - `COUNT(*)`统计总订单数 > - `ROUND(AVG(amount), 2)`对平均销售额进行四舍五入[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值