为什么十进制(2**0.5)不能给出预定义精度的数字?

0x9*_*x90 3 python python-2.7

我正在做这个线程的灵感:

>>> from decimal import *
>>> import math
>>> getcontext().prec = 1000
>>> Decimal(2**0.5)
Decimal('1.4142135623730951454746218587388284504413604736328125')
>>> Decimal(math.sqrt(2))
Decimal('1.4142135623730951454746218587388284504413604736328125')
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024924836055850737212644121497099935831413222665927505592755799950501152782060571470109559971605970274534596862014728517418640889198609552329230484308714321450839762603627995251407989687253396546331808829640620615258352395054745750287759961729835575220337531857011354374603408498847160386899970699004815030544027790316454247823068492936918621580578463111596668713013015618568987237235288509264861249497715421833420428568606014682472077143585487415565706967765372022648544701585880162075847492265722600208558446652145839889394437092659180031138824646815708263010059485870400318648034219489727829064104507263688131373985525611732204024509122770022694112757362728049573810896750401836986836845072579936472906076299694138047565482372899718032680247442062926912485905218100445984215059112024944134172853147810580360337107730918286931471017111168391658172688941975871658215212822951848847')
>>> 2**0.5
1.4142135623730951
Run Code Online (Sandbox Code Playgroud)

为什么Decimal(2**0.5)不是1000位数?

ick*_*fay 9

所述2 ** 0.5被计算为一个float,然后转换为一个Decimal.相反,Decimal从一开始就使用两个:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 100
>>> Decimal(2) ** Decimal('0.5')
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573')
Run Code Online (Sandbox Code Playgroud)

您使用是很重要的'0.5',而不是0.5使Decimal解释0.5自身从没有任何精度损失的中间0.5被转换成一个float,然后到Decimal.(由于0.52 ** -1,可能没有任何精度损失,但它是更好的安全比遗憾.)