浮点数舍入规则

前言

想信大家对四舍五入很熟悉,毕竟四舍五入是我们在小学就学了的。但很遗憾,计算机中并没有采用这种舍入方式,因此有时我们会对小数的进位产生疑惑,本文就为大家解开这个疑惑。

IEEE 规定了 4 种舍入方式,先来简单看下它们舍入结果(保留 0 位小数):

方式1.401.601.502.50-1.50
向零舍入1112-1
向下舍入( − ∞ -\infty 1112-2
向上舍入( + ∞ +\infty +2223-1
向偶数舍入(default)1222-2

上面的前三种舍入方式还比较好理解,最后一种似乎有点莫名奇妙。但它又是最重要的舍入方式,因为它是 IEEE 标准中默认的浮点数舍入方式,下文也将围绕这个方式展开。

10 进制小数

先来简单介绍下前三种方式:

  • 向零舍入:在一个数轴上,向 0 方向移动,找到第一个符合的数
    • 相当于,把正数向下舍入,把负数向上舍入
    • 得到值 x 0 ‾ \overline{x_0} x0,使得 ∣ x 0 ‾ ∣ ≤ ∣ x ∣ \mid\overline{x_0}\mid \leq \mid x \mid x0∣≤∣x
  • 向下舍入:在一个数轴上,向 − ∞ -\infty 方向移动,找到第一个符合的数
    • 得到值 x − x^- x,使得 x − ≤ x x^- \leq x xx
  • 向上舍入:在一个数轴上,向 + ∞ +\infty + 方向移动,找到第一个符合的数
    • 得到值 x + x^+ x+,使得 x ≤ x + x \leq x^+ xx+

向偶数舍入:

  1. 首先要找一个中间值,保留 0 位小数,中间值为: 0.50 0.50 0.50;保留一位小数,中间值为: 0.050 0.050 0.050;以此类推
  2. 将保留位数以后的值与该中间值比较(比如上面的:0.40、0.60、0.50)
    • 大于中间值,采取向上舍入
    • 小于中间值,采取向下舍入
    • 等于中间值,向数轴上最近的偶数舍入

下面来是一组向偶数舍入示例(保留 2 位小数):

原数舍入后情况
7.89 4999 7.89\color{Red}4999 7.894999 7.89 7.89 7.89小于中间值
7.89 5001 7.89\color{Red}5001 7.895001 7.90 7.90 7.90大于中间值
7.89 5000 7.89\color{Red}5000 7.895000 7.90 7.90 7.90等于中间值
7.88 5000 7.88\color{Red}5000 7.885000 7.88 7.88 7.88等于中间值

为什么要采用向偶数舍入?使用四舍五入不好吗?

这是基于统计学的理由:我们有一组数据,需要进行舍入后再计算平均数。假如我们我们将 0.5 直接进位,那么我们最后算出的平均值将会大于实际值。而现在一个数整体上,有 50% 机率变大,有 50% 机率变小,就不存在平均值偏大的统计误差了。

2 进制小数

向偶数舍入的方法同样可以用在 2 进制小数上。

我们将最低有效位的值 0 认为是偶数,值 1 认为是奇数。

保留 0 位小数的中间值为: 0.1 0 2 0.10_2 0.102,保留 1 位小数的中间值为: 0.01 0 2 0.010_2 0.0102,以此类推。

下面是一组 2 进制小数向偶数舍入示例(保留 2 位小数):

原数舍入后情况
10.00 011 2 10.00\color{Red}011\color{Black}_2 10.000112 10.0 0 2 10.00_2 10.002小于中间值
10.00 110 2 10.00\color{Red}110\color{Black}_2 10.001102 10.0 1 2 10.01_2 10.012大于中间值
10.11 100 2 10.11\color{Red}100\color{Black}_2 10.111002 11.0 0 2 11.00_2 11.002等于中间值
10.10 100 2 10.10\color{Red}100\color{Black}_2 10.101002 10.1 0 2 10.10_2 10.102等于中间值
  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,我们可以通过两种方法来实现浮点数的四舍五入。 方法一:利用取整规则(不使用库函数)。可以将浮点数乘以一个指定的倍数,然后将结果转换为整数,再除以倍数得到四舍五入后的结果。比如,如果要将一个浮点数保留两位小数并四舍五入,可以将其乘以100,转换为整数后再除以100.0。这样就可以实现四舍五入的效果。 方法二:使用C语言提供的库函数round函数。这个函数可以将一个浮点数四舍五入为最接近的整数。要使用round函数,需要在程序中引用"math.h"头文件,并将需要四舍五入的浮点数作为参数传入round函数。round函数会返回一个整数,表示四舍五入后的结果。 下面是使用round函数实现浮点数四舍五入的示例代码: ```c #include <stdio.h> #include <math.h> int main() { float num = 3.14159; num = round(num * 10000) / 10000.0; printf("%.4f", num); } ``` 以上代码将保留3.14159的四位小数,并进行四舍五入后输出。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [四舍五入(C语言实现)](https://blog.csdn.net/m0_72482689/article/details/125997219)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [python中实现精确的浮点数运算详解](https://download.csdn.net/download/weixin_38718434/13764793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值