跳到主要内容
CalcMax

四舍五入计算器

范围:-1,000,000,000 – 1,000,000,000

结果

1235

舍入结果

截断结果(同一位)
1234

四舍五入是把一个数换成附近的一个更好写的数,换出来的那个也就是近似数,而这件事里有两个决定,人们通常没意识到自己在做。第一个是舍到哪儿:整数、十位、百分位,或者若干位有效数字。第二个是恰好落在正中间时怎么办,两套都说得通的约定在这里分家。逢五进一(也就是教材上说的四舍五入)把一半往远离零的方向推,所以 2.5 变成 3、−2.5 变成 −3,这是学校里教的、也是多数人说「四舍五入」时脑子里想的那套。截断则朝零的方向走,2.5 变成 2、−2.5 变成 −2,它定义起来更简单,而且相当多的软件实际上就是这么做的。这一页把「舍到哪儿」做成输入项,并在同一位上把两个结果并排印出来,于是这个差别是看得见的,而不是被默认掉了。舍到哪儿有两种说法。直接说小数位是最直白的那种:个位、十位、百位、千分位,小数方向到三位为止。有效数字是理科用的那种,位数从第一个非零数字开始数、而不是从小数点开始数,所以 1567 取两位有效数字是 1600——与舍到百位同一个答案,只是走的路不同。对一个给定大小的数,这两种说法常常重合,对 1234.5678 而言六项有效数字与六个小数位正好落在同一批数位上。末尾的 0 会保留,因为它们带着信息:1234.6 是保留一位小数、1234.57 是保留两位,两者是对精确程度的不同声明,把 0 去掉这个区别就没了。第二条输出是在同一位上截断的结果,这是看清「恰好一半怎么处理」在你这个数上到底起没起作用最省事的办法。要注意这里没有的是什么:这一页一次只对一个数做舍入,它不把有效数字的位数带进一连串计算里——那种场合下结果的精度由最粗糙的那个输入决定,而末尾的 0 需要作为数位而不是数值活下来,那是另一个工具的事。

1234.5678 在七个小数位上的四舍五入与截断

舍到哪一位四舍五入截断
100010001000
10012001200
1012301230
112351234
0.11234.61234.5
0.011234.571234.56
0.0011234.5681234.567

前三行谁都看不出分歧,因为舍到很大的位置时整个小数部分都被丢掉,两套约定都落在同一个千位上:舍到千位、百位、十位,1234.5678 给出的分别是 1000、1200、1230,两列一模一样。分歧从个位那一行开始,四舍五入给 1235、截断给 1234;再往下每一行都能看见,原因相同——第一位小数上的那个 5 在个位上是一次真正的「恰好一半」,而 .5678 让后面几行都躲开了各自的中点。注意答案的小数位数是由行决定的:舍到千位没有小数,舍到千分位保留三位,所以末尾的 0 会出现并留下来。最后六项有效数字不在表里,因为它们的位置取决于数有多大;对 1234.5678 而言它们恰好落在上面这六行相同的数位上,所以取一到六位有效数字得到的是同样的那几对数字。表固定在 1234.5678 上,而它也正是默认值,所以首屏这张表解释的就是屏幕上已经算出来的那个答案;它不跟着你的输入走。

公式

1234.5678 舍到个位 ⇒ 四舍五入 1235、截断 1234;2.5 ⇒ 3 或 2;1567 取两位有效数字 ⇒ 1600

1234.5678
要舍入的数值,取 −1000000000 到 1000000000 之间,收小数。它同时是下面那张参考表的样板,所以表里七行就是这个数在七个位置上的样子
p0、pm2、s2
舍到哪儿,从同一张菜单的十三项里选。p 开头的说的是小数位:p3 是千位,p0 是个位,pm2 是百分位。s 开头的说的是有效数字位数,s1 到 s6,从第一个非零数字开始数
逢五进一
恰好一半时的规则:正好落在两个候选中间的数往远离零的方向走,所以 2.5 变成 3、−2.5 变成 −3。这是学校里教的那套,也是本书面语里的「四舍五入」。它也是那种在长串数据上求和时看起来像 bug 的规则,因为每一个 .5 都被推向同一个方向
截断
第二条输出,也是「恰好一半」这个问题的另一半:同一个数在同一位上把多余的位数直接丢掉而不是舍入,因此永远朝零的方向走。2.5 截断成 2,−2.5 截断成 −2。把它印在四舍五入旁边,是让这套约定现形最直接的办法,因为在大多数输入上两条输出完全相同
1567 → 1600
有效数字在做事的样子。位数从第一个非零数字起算,所以 1567 取两位有效数字是留下 1 与 5、把后面的舍掉,得到 1600。末尾的 0 留着:这个答案声称的是两位有效数字,而写成 1600 是读者唯一能看出这个声称的方式
1.005 → 1.01
为什么这套算术是在十进制数位上做的,而不是乘一个数、舍入、再除回去。1.005 实际存下来的值比 1.005 略小,所以通常的双精度做法把它舍成 1.00;按数位做出来的才是人期待的那个答案 1.01。下面有一格算例把这个情形钉住了

报告测量结果是经典场合,而有效数字就是从那里来的:用尺子量到毫米的长度不该报成六位小数,多出来的位数声称的是仪器从来没有过的精度。有效数字就是让这个声称保持诚实的记法,也是为什么对测量值做舍入与对一个题目里的数做舍入不是一回事。钱是小数位的日常版本——价格舍到分,而恰好一半时往哪边走是一个真实的政策问题,因为它决定了不足一分的部分归谁,而一条永远朝同一个方向推的规则在大量笔数之后会产生看得见的偏差。统计与播报为了好读而舍入:百分比留一位小数、人口舍到千位、平均数的精度与它的输入对齐。截断有自己的用途,那些用途正是它被印在这里而不是被省掉的原因:朝零取整是很多编程语言的默认行为,也是把一个数存进精度固定的格式时会发生的事。在所有这些场合里都值得记住的两条是:舍两次与舍一次不是一回事;而一个舍入后的数是关于精度的声明,不只是原数的一种短写法。对舍入后的数继续做运算会把差别累积起来,所以那个问题的有效数字版本是另一个工具。

算例

  1. 1234.5678 舍到个位

    1. 1234.5678 两边的候选是 1234 与 1235
    2. 决定它的是第一位小数,5
    3. 逢五进一把这个 5 当成往远离零方向走的理由,所以舍成 1235
    4. 后面的 .5678 不改变这件事——决定结果的是舍入位置上的那一位,后面的数字只在打平时才有用
    5. 截断则把小数部分丢掉,得到 1234

    默认值,也是下面那张参考表的样板。第一位小数上的那个 5 在起全部作用:后面的 6、7、8 都无关,1234.5001 会舍成一模一样的结果。这一格两条输出不同,那是方便的情形——大多数输入上四舍五入与截断一致,而这两个数摆在一起就是在告诉你这一格有没有碰上恰好一半。

  2. 恰好一半:2.5 舍到个位

    1. 2.5 正好落在 2 与 3 中间
    2. 逢五进一往远离零的方向走,所以四舍五入的结果是 3
    3. 截断往零的方向走,所以截断的结果是 2
    4. 两个都不是错,它们是同一份输入下的两套约定

    能看出分歧的最小一格,也是最值得记住的一格。逢五进一并不是唯一在用的约定:银行家舍入会把 2.5 推向偶数邻居 2,这在长串测量数据上是有意义的,因为总是把一半往上推会引入一点向上的偏差。这一页用的是逢五进一,也就是学校那套,而且把它写出来,而不是留给读者去发现。

  3. 负数里的恰好一半:−2.5 舍到个位

    1. −2.5 正好落在 −3 与 −2 中间
    2. 逢五进一往远离零的方向走,而负数这边远离零就是更小,所以答案是 −3
    3. 截断往零的方向走,得到 −2
    4. 符号是按「离零有多远」处理的,不是按数轴上的方向

    这一格把「逢五进一」与「一律往上进」区分开。两个数在这里按同一条规则移动——远离零——但在数轴上方向相反,因为零在中间。任何被描述成「向上舍入」而没有附加条件的代码或规则,在这件事上都是有歧义的,而参考表里那些负数行展示的是同一个效应在别的位置上的样子。

  4. 1.005 保留两位小数

    1. 两个候选是 1.00 与 1.01
    2. 决定它的是第三位小数 5,正好是恰好一半的情形
    3. 逢五进一往远离零的方向走,所以舍成 1.01
    4. 截断丢掉那个 5、留下 1.00,末尾的 0 保留下来,好让精度看得见

    这一格就是实现的理由。显而易见的做法——乘 100、舍入、再除以 100——会得到 1.00,因为 1.005 存不下来,实际存的值比 1.005 略小。人期待的是 1.01,而按十进制数位做出来的就是它。同样的情形在很多日常数值上都会出现,所以末位差一的结果通常是这件事,而不是规则本身错了。

  5. 1567 取两位有效数字

    1. 第一位有效数字是千位上的 1,第二位是 5
    2. 两位有效数字意味着留下这两位、在百位上做舍入
    3. 紧跟其后的是 6,把 5 进上去,于是得到 1600
    4. 末尾的 0 留着,因为它们记录的正是「保留了两位有效数字」这件事
    5. 在同一位上截断得到 1500

    与舍到百位同一个答案,只是从另一头走过来的。要注意输出说不出来的东西:写成普通数字的 1600,与「舍到个位的 1600」、或者与「恰好就是 1600 的一个测量值」都分不出来。留着那些 0 是这个记法能做到的极限,而把有效数字带进一连串计算——让位数在乘除里活下来——与对一个数做舍入是两件事。

局限

数值必须落在 −1000000000 到 1000000000 之间,小数也算;而「舍到哪儿」只能从十三项里选,没法自己填一个菜单之外的位置。舍入是按写出来的十进制数位做的,不是靠浮点缩放,所以结果与数位说的话一致——1.005 保留两位在这里是 1.01,而常见的「乘、舍、除」那条路会给出 1.00。同一个选择还有一处看得见的后果:结果一律用小数点、也从不加千分位分隔符,所以把逗号当小数点用的读者会在答案里看到一个句点。这是有意的,与其余印文本结果的那些页一致。末尾的 0 会保留,因为它们记录的是答案声称的精度,所以 1234.6 与 1234.60 是不同位置给出的不同输出,写法上不会一样。负数是按离零的距离舍入的,所以负的恰好一半会往数轴的下方走。下面那张参考表固定在 1234.5678 上,不跟着你的输入走;它把前七个选项用在那一个数上,而六项有效数字在该表的 note 里用文字交代,不单独占行。这里不做累计量的舍入,也不累积任何东西:这一页一次只对一个数做舍入。

常见问题

逢五进一是什么意思?
就是正好落在两个候选中间时往远离零的方向走:2.5 变成 3,−2.5 变成 −3。这是学校教的那套,也是这一页用的那套。它并不是唯一在用的约定——银行家舍入会把一半推向偶数邻居,从而避免「总是把一半往上推」在长串数据上引入的那点向上偏差。
小数位和有效数字有什么区别?
小数位从小数点开始数,有效数字从第一个非零数字开始数。1567 取两位有效数字是 1600,与舍到百位一样;而 1567 保留两位小数是 1567.00。有效数字是测量值用的记法,因为同一个量换成别的单位写,位数不会跟着变。
为什么 1.005 舍成 1.01 而不是 1.00?
因为这个值正好落在中点上,而这一页是往远离零的方向舍的,并且是按十进制数位来算、不是靠浮点缩放。常见的做法「乘 100、舍入、除以 100」会给 1.00,因为 1.005 实际存下来的值比 1.005 略小。按数位得到的 1.01 才是规则说的那个数,也是人把这数写下来时会得到的那个。
截断是什么,为什么要印出来?
截断是把多余的位数直接丢掉而不是舍入,所以永远朝零的方向走:2.5 变成 2,−2.5 变成 −2。它被印在四舍五入旁边、而且是在同一位上,因为这两个数摆在一起是看出「这次有没有碰到恰好一半」最清楚的办法——离中点远的输入上两条输出一致,不一致的地方就是约定造成的差别。
末尾的 0 算有效数字吗?
算,而且是特意保留的。1234.6 保留一位小数、1234.57 保留两位,两者是对精确程度的不同声明,把末尾的 0 去掉这个区别就没了。整数取有效数字时也一样:1600 留着它的 0,因为那些 0 记录的正是保留了两位有效数字这件事。
这一页会把有效数字带进计算里吗?
不会。它一次只舍入一个数,不把精度带着走完一串运算——那种场合下结果由最粗糙的那个输入决定,而中间值必须一直留着不舍,到最后才动。这与舍入一个单值是两个问题,因为它需要有效数字的位数在乘除里活下来,而一个普通的舍入结果表达不了这件事。

参考资料

相关计算器