`

浮点数0.57 0.58 造出的坑爹问题

阅读更多

看下面代码:

console.log(parseInt(0.59*100),parseInt(0.58*100),parseInt(0.57*100),parseInt(0.56*100))

 你猜输出什么呢?

 

在 PHP里面

var_dump(intval(0.59 * 100));
var_dump(intval(0.58 * 100));
var_dump(intval(0.57 * 100));
var_dump(intval(0.56 * 100));

 

不知道py里面是不是这样...

 

哈哈哈 为什么 只有 0.57/0.58 这个呢

2
5
分享到:
评论
9 楼 justjavac 2013-05-10  
vb2005xu 写道
果然如此,你的http://justjavac.iteye.com/blog/1724438 让我受益很多啊

你的博文也很不错,共同交流,共同进步。
8 楼 vb2005xu 2013-05-10  
果然如此,你的http://justjavac.iteye.com/blog/1724438 让我受益很多啊
7 楼 justjavac 2013-05-09  
vb2005xu 写道
此处的精度问题 为什么 只有0.57/0.58 这两个有问题 而 0.59 0.56 等却没有问题呢

这几个都有问题,只是你选择的乘数100,太小了,问题没有显现出来而已。
6 楼 justjavac 2013-05-09  
vb2005xu 写道
此处的精度问题 为什么 只有0.57/0.58 这两个有问题 而 0.59 0.56 等却没有问题呢


还是这篇文章,代码之谜(五)- 浮点数(谁偷了你的精度?),仔细品味一下。如果把它们写出2进制浮点数,就明白了。其实一个令人震惊的事实就是,99%的数不能够被精确的表示为浮点数。


0.56*10056.00000000000001
0.57*10056.99999999999999
0.58*10057.99999999999999
0.59*10059


看到上面的表格,好像 0.59 可以精确表示一样,其实不然,首先,0.59的末尾是9,意味着他不可能被转换成有限二进制小数(why?)。肯定是一个循环小数,如果循环节超过了浮点数的尾数,那么就给人一种可以精确表示的假象。(设计到很多公式,就不写了,以后专门写博客讨论)。

运行: 0.59*1e71
结果: 5.9e+70

运行: 0.59*1e72
结果: 5.899999999999999e+71

看出端倪来了吗?
5 楼 vb2005xu 2013-05-09  
此处的精度问题 为什么 只有0.57/0.58 这两个有问题 而 0.59 0.56 等却没有问题呢
4 楼 justjavac 2013-05-09  
vb2005xu 写道
不知道py里面是不是这样


0.58*100 = 57.99999999999999 是超越语言的,是IEEE规定的浮点数的运算标准,一般情况下,57.99999999999999会四舍五入到58。其实浮点数遇到5后,不一定总是入,具体可以看浮点数规范。

为什么结果是 57 呢,主要是因为 parseInt 和 intval 函数。他们的规则是,从第一个数字开始,知道遇到不是数字的字符,结束。

所以

parseInt("012") 结果是 10 (不要惊讶,0开头的数字是八进制)
parseInt("12abc") 结果是 12 (不解释)
parseInt("12.123") 结果是 12

12e5 是多少呢?科学计数法,结果是 1200000(12后面五个0)

parseInt("12e5") 的结果呢?结果是12,因为e字符不是数字,所以后面的都忽略了。


parseInt("abc") 这个呢?结果是0?如果是0的话,你让 parseInt("0abc") 情何以堪啊!结果是 NaN (Not a Number)。
3 楼 justjavac 2013-05-09  
0.58*100 的结果是 57.99999999999999
parseInt 并不是四舍五入,所以就变成了 57。
2 楼 justjavac 2013-05-09  
1 楼 lukeme 2013-05-08  
确实奇怪,结果竟然是
59 57 56 56

相关推荐

    关于浮点数的精度问题

    "关于浮点数的精度问题" 浮点数精度问题是一个经典的问题,对于了解和学习C语言有一定帮助。浮点数的精度问题是由于计算机对浮点数的存储方式和表示方法所致。 IEEE754 的浮点数存储格式对浮点数的表示方法进行了...

    浮点数精度问题解答——浮点数

    浮点数精度问题在计算机科学中是一个至关重要的概念,尤其对于进行数值计算的开发者来说,理解和掌握浮点数的表示和精度误差至关重要。本文将详细阐述IEEE 754标准,这一标准对浮点数的表示和计算进行了规范,旨在...

    解决javascript中的浮点数计算不精确问题

    在JavaScript编程中,浮点数计算不精确是一个常见的问题,源于其内部的二进制浮点数表示方式。本文将深入探讨这个问题,并提供解决方案。首先,我们要理解为什么会出现这种不精确性。 JavaScript遵循IEEE 754标准来...

    64位浮点数与32位整数或32位浮点数之间的相互转换(V17版本仅限1500系列PLC使用).zip

    而从32位整数转为64位浮点数则没有这个问题,因为64位浮点数的精度更高。 32位浮点数转换为64位浮点数时,虽然不会丢失精度,但转换过程可能涉及数据扩展,确保所有信息得到保留。从64位浮点数转换为32位浮点数时,...

    浮点数(单精度浮点数,双精度浮点数)

    浮点数(单精度浮点数,双精度浮点数) 浮点数是一种数字表示方法,用于近似表示任意实数。在计算机中,浮点数由一个整数或定点数(即尾数)乘以某个基数(通常是 2)的整数次幂得到。这种表示方法类似于基数为 10 ...

    深入浅出浮点数

    【深入浅出浮点数】 浮点数是计算机科学中用来表示实数,特别是小数的一种数据类型。由于计算机内存和处理能力的限制,不能精确地存储所有的实数,因此产生了浮点数表示方法。浮点数的核心概念包括尾数、基数、指数...

    float_2_char.zip_C51 float转char_单片机 浮点数_浮点数 char_浮点数 转换_浮点数转换

    `float_2_char.zip` 提供的代码着重解决了单片机中浮点数(`float`)与字符型(`char`)之间的转换问题,这对于节省存储空间、提高通信效率以及降低错误率非常有用。下面将详细介绍浮点数与字符型之间的转换原理和...

    十六进制转浮点数,十六进制转浮点数在线,LabView

    16进制字符串首先需要转换成二进制表示,然后根据IEEE 754标准解析出符号、指数和尾数。这个过程包括以下几个步骤: 1. **十六进制到二进制**:LabVIEW提供了内置函数,如“Hex to Bin”(十六进制到二进制),可以...

    双精度浮点数转换

    在计算机科学中,浮点数是一种用于...无论是单精度还是双精度浮点数,了解它们如何在不同表示形式之间转换,以及如何进行实际转换,都能增强我们对计算机内部运作的理解,从而更好地利用这些数据类型来解决实际问题。

    TMS320C3x浮点数简介、IEEE754的32位转VC33的32位浮点数算法、IEEE754的64位浮点数转VC33的40位浮点数算法

    在数字信号处理领域,浮点数运算在许多高级计算任务中扮演着重要角色。TMS320C3x是一款由德州仪器(TI)推出的数字信号处理器(DSP),它支持浮点运算,使得复杂的数学计算得以高效执行。本文将深入探讨TMS320C3x中...

    浮点数的DFA识别算法

    在处理浮点数识别时,DFA能够有效地识别出由整数部分、小数点和小数部分组成的数字串。 首先,我们需要理解浮点数的基本结构。在十进制表示中,浮点数通常由可选的正负符号、一个整数部分、一个点(小数点)、一个...

    单片机浮点数设计 单片机浮点数设计

    单片机浮点数设计是嵌入式系统开发中的一个重要环节,特别是在资源有限的环境中,如微控制器(MCU)等。浮点数运算在科学计算、...通过合理的设计和优化,我们可以让单片机在有限的资源下发挥出处理浮点数的强大能力。

    浮点数与十进制数转换工具

    这就是著名的浮点数舍入误差问题,它在计算领域是一个重要的概念,需要在设计算法和编写代码时予以考虑。 在编程语言中,如Python、Java、C++等,都有内置的函数或者库来支持浮点数和十进制数之间的转换,例如...

    S7-200SMART 64位浮点数转32位浮点数(源文件+库文件+程序注释).rar

    这个过程涉及到浮点数的表示方式、数据类型的转换以及可能的精度损失问题。 64位浮点数,也称为双精度浮点数(Double Precision Floating Point),遵循IEEE 754标准,它由32位的指数部分、11位的隐藏位和52位的...

    JLINK RTT打印浮点数

    5. **效率优化**:在处理浮点数打印时,需要考虑效率问题。例如,如果浮点数频繁打印,应避免每次都创建新的字符串,而是复用已有的缓冲区。 在"JLINK RTT打印浮点数替换文件"中,可能包含了一个优化过的浮点数转换...

    HEX与浮点数相互转换

    2. **HEX到浮点数**: 反向过程,从HEX字符串解析出二进制表示,再根据IEEE 754的规则计算出浮点数。这需要正确解读符号位、指数和尾数,考虑到指数的偏移值和尾数的规格化。 在标签中,“HEX”和“浮点数”进一步...

    4.15实验-浮点数的表示及运算

    此外,浮点数比较也不总是准确的,因为两个看似相等的浮点数在二进制下可能有所不同,因此比较时需注意精度问题。 四、浮点数运算的性能优化 在实际应用中,理解和优化浮点数运算的性能至关重要。处理器通常具有...

    S7-200SMART_双精度浮点数转换为单精度浮点数库文件及使用说明.rar

    本文将详细介绍如何使用S7-200SMART进行双精度浮点数到单精度浮点数的转换,并提供相应的库文件及使用说明。 1. **浮点数类型**: 浮点数在计算机中分为单精度浮点数(32位,IEEE 754标准)和双精度浮点数(64位,...

    浮点数转换工具(十六进制转浮点数)

    浮点数转换在计算机科学中是一项基础且重要的概念,特别是在编程和数字处理领域。浮点数,顾名思义,是指可以表示小数部分的数值,与整数相对。它们在计算机内部通常以二进制浮点数的形式存储,遵循IEEE 754标准。这...

    C程序中用union实现浮点数与IEEE格式转换

    1. 问题的提出 笔者在系统开发中采用RS485实现单片机与外围设备的通信,通信采用...例如,前面绘出的浮点数的表示形式中,s=0,n=132,m=(1/2+0/4+0/8+1/16+0/32+……),则计算结果为50.0. 3.浮点数与IEEE格式转换

Global site tag (gtag.js) - Google Analytics