今天看到 vb2005xu 提到了一个问题 浮点数0.57 0.58 造出的坑爹问题。
parseInt(0.59*100) // 59
parseInt(0.58*100) // 57
parseInt(0.57*100) // 56
parseInt(0.56*100) // 56
为什么会这样呢?随后又举了 PHP 的例子,结果还是一样的结果,只是函数换成了 intval,于是 vb2005xu 猜想,是不是 python 也这样呢。
这个问题看似奇特,其实还是浮点数的精度的问题,我以前写的这篇文章:代码之谜(五)- 浮点数(谁偷了你的精度?)
0.58*100 的结果是什么?其实大家试试就知道了,并不是想象中的 58,而是 57.99999999999999。为什么?看我上面的文章。
是 js 或者 php 这些动态语言的怪癖吗?C语言,java会这样吗?
其实 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)。
为什么结果是 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)。
-----------------2013-05-09 17:12 补充-----------------------------------------
vb2005xu 写道
此处的精度问题 为什么 只有0.57/0.58 这两个有问题 而 0.59 0.56 等却没有问题呢
由于时间问题,临近下班了,所以不细解释了。还是这篇文章,代码之谜(五)- 浮点数(谁偷了你的精度?),仔细品味一下。如果把它们写出2进制浮点数,就明白了。其实一个令人震惊的事实就是,99%的数不能够被精确的表示为浮点数。
0.56*100 | 56.00000000000001 |
0.57*100 | 56.99999999999999 |
0.58*100 | 57.99999999999999 |
0.59*100 | 59 |
看到上面的表格,好像 0.59 可以精确表示一样,其实不然,首先,0.59的末尾是9,意味着他不可能被转换成有限二进制小数(why?)。肯定是一个循环小数,如果循环节超过了浮点数的尾数,那么就给人一种可以精确表示的假象。(设计到很多公式,就不写了,以后专门写博客讨论)。
运行: 0.59*1e71
结果: 5.9e+70
运行: 0.59*1e72
结果: 5.899999999999999e+71
看出端倪来了吗?
相关推荐
计算机组成原理:浮点数表示及运算.ppt
计算机组成原理:浮点数表示及运算 .ppt
计算机组成原理:浮点数表示及运算..ppt
第二章 信息的表示和处理Ⅱ:浮点数教师:夏文计算机科学与技术学院哈尔滨工业大学(深圳)School of Computer Science and Techno
Python技法:浮点数取整、格式化和NaN处理.doc
格式:cbfi 0xXXXXXXXX 表示将二进制布局转换为浮点数,只有 16、32、64 位有效。 cbfi XXXXX.XX 表示转换为浮点的二进制布局此外,您可以使用 -d 选项来显示您可能需要的更多信息。 示例:<22>pli[9903]@~/...
介绍乘法器的设计,可以看看哦,主要是关于定点和浮点的问题
计算机算法设计与分析实验:浮点数的分数表达,可运行源代码,c++
一个 floatrange 类的工作方式类似于 Python range,但允许为 start、stop 和 step 提供浮点值。 还支持在 floatrange 上操作时浮点数比较的精度级别(x in r, r[n], r.index(v)...)。
mips简单计算器(CQU计算机组成原理期末项目) 支持两种功能:浮点数的表示(转化) & 浮点数的运算和运算结果的表示 功能未完全完善,仅供参考!
计算浮点数的n次方,在北京大学的OJ网站上的题目,已经提交AC。可以作为参考。 原题如下: Description Problems involving the computation of exact values of very large magnitude and precision are common. ...
数学钱数学货币是一个模块,旨在通过不使用纯浮点数进行操作来安全地操纵货币。安装 npm install math-money快速开始 var Money = require ( 'math-money' ) ; var oneDollar = Money . Dollar ( 1 ) ; //create ...
浮冰非常适合长时间运行的业务流程执行的工作流引擎,例如: 持续交付。 持续集成。 客户入职。快速开始从头下载或构建floe可执行文件。 启动两个主机进程: floe -tags = linux,go,couch -admin = 123456 -host_...
“燃料”:{“气体(欧元/兆瓦时)”:浮点数,“煤油(欧元/兆瓦时)”:浮点数,“二氧化碳(欧元/吨)”:浮点数,“风(%) “:float},” powerplants“:[{”名称“:字符串,”类型“:字符串”,“效率”...
近似:近似浮点数相等比较和断言
若 number 是倍精确浮点数,则返回值也是倍浮数;其它的类型则返回类型为整数。 • Acos: 取得反余弦值。 语法: float acos(float arg); 返回值: 浮点数 函数种类: 数学运算 内容说明返回参数 arg 的反余弦值 (arc...
C:二十进制数 D:浮点数 2. 机器语言是一种( )语言。 A:十进制 B:二进制 C:ASCII码 D:BCD码 3. 计算机的硬件系统是由( )构成。 A:I/O设备、CPU B:I/O设备、CPU、存储器 C:存储器、CPU D:以上都不是
用java做一个简单的计算器,基于swing,实现了基本的加减乘除四则运算,和多元运算。...已知问题:浮点数运算精度问题,例如0.1+0.2不等于0.3,运算符可以按出多个问题,++++++++。适合用来交作业,代码解压就能看到。
算法-计算浮点数相除的余(信息学奥赛一本通-T1029)(包含源程序).rar
1. 问题的提出 笔者在系统开发中采用RS485实现单片机与外围设备的通信,通信采用...例如,前面绘出的浮点数的表示形式中,s=0,n=132,m=(1/2+0/4+0/8+1/16+0/32+……),则计算结果为50.0. 3.浮点数与IEEE格式转换