为啥老黑 js 的 0.1+0.2 不等于 0.3?

2018-07-06 23:52:00 +08:00
 fulvaz

先上代码

class main {
	public static void main(String[] args) {
		double a = 0.1;
		double b = 0.2;
		System.out.println(0.1+0.2);
	}
}

今晚参加个面基活动, 有人提出可以利用 js 做浏览器端科学运算, 然后又又又有人立刻反驳 0.1+0.2 这个问题, 连前端自己都黑.

嗯....IEEE754 了解一下? 将来报道出现了偏差你们是要负责的.


ps: 今晚的面基活动挺有意思的, 大部分内容是心脏按摩, 要扛得住压力, node.js 一把梭就是干, 不要怂.

4550 次点击
所在节点    程序员
18 条回复
joouis
2018-07-06 23:55:36 +08:00
没觉得有人黑呀,py 也是,如楼主所说就是 IEEE754 规定的~
ToT
2018-07-06 23:57:28 +08:00
是 double 型 精度问题么?

'''
>>> 0.1+0.2
Out[2]: 0.30000000000000004
'''
jiang42
2018-07-06 23:58:28 +08:00
一般黑的是一加一不等于二吧……
fulvaz
2018-07-07 00:03:04 +08:00
fulvaz
2018-07-07 00:03:21 +08:00
@ToT 对.
fulvaz
2018-07-07 00:08:05 +08:00
一般黑的应该是 js 那套令人糟心的转换规则

除了===, 其他比较运算符会自动进行类型转换, 甚至对对象也进行转换

+, -也会进行类型转换

emac262 有详细说明----然后你会发现红宝书(js 高级编程)讲漏了, 或者是书上的表述不准确, 但是这并不能说红宝书不好, 至少你能直接啃 emac262 之前, 红宝书带你入门了

但是一般人也不会写出这种东西来, 因为上一个死活要让数字和数组比出大小的人已经被开除了.
rabbbit
2018-07-07 00:10:18 +08:00
烦人的是面试总考这些东西,有时侯不注意会踩坑

刚遇到的
当一个对象被传递给 fill 方法的时候, 填充数组的是这个对象的引用.
> a = new Array(9).fill([])
[ [], [], [], [], [], [], [], [], [] ]
> a[0][0] = 1
1
> a
[ [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ], [ 1 ] ]
ca1123
2018-07-07 00:19:08 +08:00
浮点运算是对 “自然数域” 的模拟,甚至不能这么简单说。从抽象功能到具体实现,逐步放弃一些东西,基本是:
自然数运算 -> 有理数运算 -> 有限位数的小数运算 -> 浮点运算 -> 布尔代数运算 -> ALU 硬件
Mathematica 之类这种大型软件解决了自然数里面,抽象定义无理数的问题。(当然也包括其它数学结构)
有理数运算是可以用高级语言实现的,就像 R 之类的东西提供的功能。
有限位数小数运算,计算器做的就比较好。他会四舍五入。
浮点运算是为了迁就 ALU 做出来的,效率比较高,你可以假装定义上的缺陷是误差来编程,也没什么大碍。
ALU 就是基本的电路逻辑了。
ca1123
2018-07-07 00:20:52 +08:00
或者基本上有限位数的小数运算等同于整数运算,再加上控制上下溢出和点小数点。
startar
2018-07-07 00:51:02 +08:00
没有整数类型 在某些场景下是个坑。尤其是用到 int64 的时候
Raymon111111
2018-07-07 01:52:38 +08:00
为啥可以无脑的
[] + {} ?
{} + [] ?

允许这种行为的语言???
janxin
2018-07-07 09:14:12 +08:00
你根本不了解 js 力量系列
lamCJ
2018-07-07 09:44:45 +08:00
老板催进度 竞争对手又是巨硬 程序员在亚历山大的情况下 10 天搞出来的东西 可能本身就没考虑那么多吧(误+笑

另外谁能在互联网刚开始( 1994+1 )的时候 就能预料到因为 0.1+0.2 !== 0.3 会给现代程序员带来的“忧伤”呢?毕竟从数制转换原理的层面上 这种现象只是没有伪装 直接表现出来而已 也不光 js 一个
fulvaz
2018-07-07 10:24:51 +08:00
@Raymon111111 因为很简单....前端永远不知道后端会传来什么奇奇怪怪的值, 也不知道用户会传来什么奇怪的值, 有些值就算错了也没关系, 可能 ui 上也看不到, 这样宽容的设计在前端没问题啊, ui 总不能随便崩对吧?
azh7138m
2018-07-07 10:54:49 +08:00
@lamCJ 不会带来忧伤,浮点数就是这个样子的,换个语言也这样,或者说是,为这种特性能 js 的,应该是没有系统的学过 cs
ca1123
2018-07-07 12:16:42 +08:00
靠,我说的自然数其实是实数的意思。。。
fulvaz
2018-07-07 13:39:18 +08:00
@ca1123 ....老铁, 我觉得我要去把书捡回来, 我记得貌似真和加法器啥的有关, 不过太久远了...全忘了
suduo1987
2018-07-10 11:16:50 +08:00
http://0.30000000000000004.com/
了解一下,不光是 JS

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/468792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX