0.1 + 0.2 = 0.30000000000000004 ??? 浮點數,主要形成原因是,電腦中的所有數據都是以二進位形式存在,具體原因不在這裡說了,剛開始看了別人的文章,寫了好長一段,還是很牛 * 的,但是太長,有些比較簡單的加減有點殺雞用牛刀的感覺, 我用一行代碼解決的方案在最底下。 別 ...
0.1 + 0.2 = 0.30000000000000004 ???
浮點數,主要形成原因是,電腦中的所有數據都是以二進位形式存在,具體原因不在這裡說了,剛開始看了別人的文章,寫了好長一段,還是很牛 * 的,但是太長,有些比較簡單的加減有點殺雞用牛刀的感覺,
我用一行代碼解決的方案在最底下。
別人的解決方案:
add(a, b) {//相加
var c, d, e;
try {
c = a.toString().split(".")[1].length;
} catch (f) {
c = 0;
}
try {
d = b.toString().split(".")[1].length;
} catch (f) {
d = 0;
}
return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) + this.mul(b, e)) / e;
},
sub(a, b) {//相減
var c, d, e;
try {
c = a.toString().split(".")[1].length;
} catch (f) {
c = 0;
}
try {
d = b.toString().split(".")[1].length;
} catch (f) {
d = 0;
}
return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) - this.mul(b, e)) / e;
},
mul(a, b) {//主體
var c = 0,
d = a.toString(),
e = b.toString();
try {
c += d.split(".")[1].length;
} catch (f) { }
try {
c += e.split(".")[1].length;
} catch (f) { }
return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
},
div(a, b) {//除
var c, d, e = 0,
f = 0;
try {
e = a.toString().split(".")[1].length;
} catch (g) { }
try {
f = b.toString().split(".")[1].length;
} catch (g) { }
return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), this.mul(c / d, Math.pow(10, f - e));
} 用到哪個,只要mul和你用到的函數就OK
我的解決方案:我當時需要用的是任意一個數字(以a代表),每次需要加0.1。將小數 a + 0.1, 如果a有小數0.2,就會出錯。
那我每次(a*10 + 1)/10 就可以解決,思路就是不讓加減里出現小數,這個方案稍微有點限制,需要只有一位小數,或者有固定幾位小數。
這樣每次乘以10的幾次冪,得出結果,再變回原來的倍數可以了。如果每次小數個數不固定,用上面的方法比較好。
如果沒看懂可以聯繫我。