做外貿(mào)的物流網(wǎng)站有哪些天津百度推廣排名優(yōu)化
最近遇到一個python的小數(shù)的問題,本來應(yīng)該很簡單的小于判斷,無論如何都不正確,而且浮點(diǎn)小數(shù)都沒問題,但decimal小數(shù)有問題,給我整蒙了,后來才發(fā)現(xiàn)是對decimal不了解所致,如果你還用float轉(zhuǎn)decimal求解精確結(jié)果,那你一定要看看本文,以下是jupyter的python代碼和運(yùn)行結(jié)果
# 首先導(dǎo)入decimal模塊
from decimal import DecimalDecimal("0.000000001")
Decimal('1E-9')
# 可以看到decimal可以將 string類型轉(zhuǎn)為精確小數(shù),而且可以反向轉(zhuǎn)換
Decimal("0.000000001").to_eng_string()
'1E-9'
format(Decimal("0.00000001"), "0.8f")
'0.00000001'
# 但是有如下問題,float的如下判斷是false:0.11 < (0.1 +0.01)
False
# decimal的如下判斷卻是True
Decimal("0.11") < (0.1 +0.01)
True
Decimal("0.11") < Decimal(0.1 +0.01)
True
Decimal("0.11") < Decimal(0.1) + Decimal(0.01)
True
# 更為嚴(yán)重的是,從小數(shù)轉(zhuǎn)換為decimal的結(jié)果可能與常識不符
Decimal("0.11") == Decimal(0.1) + Decimal(0.01)
False
# 注意下面的結(jié)果
Decimal(0.1 +0.01)
Decimal('0.11000000000000000055511151231257827021181583404541015625')
0.1 + 0.01
0.11
Decimal(0.1) + Decimal(0.01)
Decimal('0.1100000000000000057592819402')
Decimal("0.1") + Decimal("0.01")
Decimal('0.11')
# 所以Decimal最好從字符串轉(zhuǎn),而不是通過float轉(zhuǎn),這樣會有精度問題Decimal("0.1") + Decimal("0.01") == Decimal(0.1) + Decimal(0.01)
False
Decimal("0.1") + Decimal("0.01") == 0.1 + 0.01
False
# 最后看一個實(shí)際應(yīng)用對比Decimal("0.0101") < 1*Decimal("0.0001") + Decimal("0.01")
False
Decimal("0.0101") < 1*Decimal(0.0001) + Decimal("0.01")
True
# 不過0的轉(zhuǎn)換沒有問題
Decimal("0") == Decimal(0)
True
Decimal()
Decimal('0')
# 和java中的BigDecimal很像,使用時都需要注意,java的bigdecimal用法可以參考: https://juejin.cn/post/7374683456729104438