四舍五入的值不能与非四舍五入的对应值相加[重复]

Posted

技术标签:

【中文标题】四舍五入的值不能与非四舍五入的对应值相加[重复]【英文标题】:Rounded values do not sum up to their non-rounded counterparts [duplicate] 【发布时间】:2016-07-24 17:58:50 【问题描述】:

假设我有一些值(代表某个总金额的份额)的总和正好为 100,例如:

13.44500
35.35500
40.39877
10.80123

如果我将它们四舍五入到小数点后两位,我会得到以下值,这些值不再总和为 100,而是总和为 100.01

13.45
35.36
40.40
10.80

我知道四舍五入会丢弃信息,但我一直认为,既然我们以相同的方式丢弃每个数字的信息,总和不应该改变。因此我的问题是:

四舍五入的数学属性是什么? 为什么四舍五入的值总和与原始值不同? 当我只能显示数值和总和的两位小数时,向用户显示这些值和总和的最佳做法是什么?由于基础数据总和为 100,我不想显示总和不同的值。

【问题讨论】:

很多很多图表都有一个脚注“由于四舍五入,数值可能不会增加到 100%。”大多数时候,甚至没有人会注意到非 100%(如果发生的话)。您的示例之所以引人注目,是因为您只有两个非零最低有效数字。 还有***.com/q/13483430/2336725 感谢您提供这些问题的链接,我没有注意到它们! 【参考方案1】:

这个问题来自于 1/2 或 0.5 向上取整的事实。

从所有四舍五入的数字中“以相同的方式丢失数据”并不意味着对数字的数学运算将不受影响。

看到了

1.005 + 1.005 = 2.01

但是它们每个都向上取整到1.01(如果我们四舍五入到小数点后两位)所以,如果我们在添加之前四舍五入,我们自然会得到:

1.01 + 1.01 = 2.02

【讨论】:

你对我的第三个问题有什么建议吗? 无偏舍入规则也会发生这种情况(例如舍入到偶数) 最佳实践是主观的,但根据所代表的数据,我会说 1. 向用户显示完整的精度,或者 2. 接受四舍五入的数字的总和与确切的总和不匹配. 这不仅仅是 0.5 的四舍五入。完全是圆的。比如三份 1/3=.3333... 是的。我的意思是 OP 的问题是由于两个 0.005 值四舍五入而特别发生的。除了错误的假设,即舍入所有涉及的值不会影响对它们的数学运算

以上是关于四舍五入的值不能与非四舍五入的对应值相加[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Convert.ToDecimal() 会导致 C# 中的值四舍五入。如何克服这个问题?

为啥当我输入整数数据时,它的值在 Codeigniter 中总是四舍五入

Mysql AVG 函数出来多余的小数,怎么解决

如何将值向上舍入到一个数字的最接近的因子[重复]

设float a 并且a已赋值,能将a的值四舍五入保留两位小数的选项是

c语言中有没有进行四舍五入的函数