Double与float关于四舍五入的问题

275 阅读5分钟

Double与float关于四舍五入的问题

在编程中,浮点型的四舍五入是一个常见的操作。

四舍五入的基本概念是根据要保留的小数位数,对数字进行处理。如果要保留的下一位数字小于 5 ,则舍去;如果大于等于 5 ,则将当前位数字加 1

但是在我做到这样一道题时,四舍五入似乎失灵了

屏幕截图 2024-10-18 004406.png 为了减少精度的损失,首先我用double浮点型定义数据并调试

double调试正常.png 似乎是理所当然的,这个代码轻而易举地通过了调试。

但是当我自信满满地将它至系统时,令人意想不到的事发生了

double提交出错.png 在调试器中顺利通过的代码在提交后却显示运行出错,四舍五入似乎在这里首次失灵了。

我想,既然double定义不通过,那我就用float类型试试吧。

float通过.png

奇怪的是,精度更低的float类型反而在四舍五入这一方面要比double类型更为精准。

但事实真是如此吗?为了探究这一问题,我在下载的代码系统中重新敲了float类型的代码并运行。所得结果却令我更为不解。

在题目中double类型遇到的五舍六入在float类型上也发生了

float四舍五入错误.png

所以这到底是个甚么情况呢?用了精确度更高的double浮点型定义所需变量。在使用double浮点型时,所生成的代码可以在调试器中正常运行且得到正确的四舍五入的结果。但是当我提交该代码至系统时,实际输出却与预期输出产生了偏差。运算法则似乎从预期的四舍五入变为了五舍六入。于是我将double浮点型用float浮点型替换,希望得到预期的结果。奇怪的是,我使用了精确度更低的float浮点型时,提交至系统的代码却可以以预期结果的形式通过难道就真的是double与float类型随机使用四舍五入五舍六入吗?

带着疑惑,我搜索了double浮点类型与float浮点类型在四舍五入方面的原理与特点

浮点点数的四舍五入有时不正确,主要是由于计算机在存储浮点数时采用的是二进制的科学计数法,这种表示方式存在精度限制。

浮点数的精度是有限的,并非能精确表示所有的十进制小数。在进行计算和四舍五入操作时,可能会引入微小的误差。

例如,某些十进制小数在转换为二进制时可能是无限循环的,这就导致了存储和计算时的近似。当进行四舍五入时,基于这种不精确的表示,结果可能与预期有所偏差。

另外,不同的编程语言和库在实现四舍五入的算法上可能存在差异,这也会影响最终的结果。

为了尽量减少浮点数四舍五入的错误,在对精度要求较高的场景中,可以采用一些特定的策略,如增加精度、使用特定的数学库或采用整数运算来模拟小数运算等。

在系统处理四舍五入时,doublefloat 的运作原理有一些相似之处,但也存在一些差异。

float 通常占用 4 个字节,提供大约 6 - 7 位有效数字的精度;double 通常占用 8 个字节,能提供大约 15 - 16 位有效数字的精度。

在进行四舍五入操作时,由于计算机内部使用二进制来表示浮点数,这会导致一些十进制小数在转换为二进制时可能是无限循环的。例如,0.1 在二进制中是一个无限循环小数,计算机只能用有限的位数来近似表示它,这就导致了精度的损失。

当进行四舍五入时,系统会根据当前的精度和要保留的小数位数来决定如何处理。如果要四舍五入的位后面的数字小于 5 ,则直接舍去;如果大于等于 5 ,则将前面的数字加 1 。

然而,由于精度限制,在接近边界值的情况下,可能会出现一些与预期不太一致的结果。对于 double ,由于其精度更高,相对来说出现这种不一致的情况会少一些,但仍然可能存在。

由此可知:

原因:

浮点数的精度有限,在进行四舍五入操作时可能会出现一些细微的偏差,特别是在接近边界值的情况下。

**1.**边界情况指的是那些处于四舍五入规则边缘的数值。比如,当要将一个浮点数四舍五入到特定的小数位时,如果处于边界值,如 2.5 要四舍五入到整数,按照规则会进位为 3 ;而 2.4 则会舍去为 2 。但在计算机中,由于浮点数的精度限制,可能会出现一些特殊情况。例如,一个非常接近但不完全等于边界值的数,如 2.499999 ,由于精度问题,可能会被错误地四舍五入。

**2.**精度误差则是由于计算机在存储浮点数时采用的是二进制的近似表示。很多十进制小数在二进制中无法精确表示,只能用一个接近的值来替代。这就导致了在进行计算和四舍五入操作时可能产生误差。比如,多次的浮点数运算可能会累积这些精度误差,使得最终的四舍五入结果与预期不符。

解决:

先确定四舍五入到哪一位,然后先将该数的那一位前面的数变成整数(乘以10的倍数),然后加上 0.5 0.5 0.5 ,就可以实现四舍五入,然后再进行还原(除以10的倍数)。

总之,理解浮点型的四舍五入对于正确处理数值计算和结果展示非常重要,需要根据具体的编程语言和应用场景选择合适的方法,并注意可能出现的精度问题。