python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python decimal使用出现的问题

python中关于decimal使用出现的一些问题

作者:sven365

这篇文章主要介绍了python中关于decimal使用出现的一些问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python decimal使用出现的问题

问题1:默认小数位过多

默认的小数位数为28位,需求为根据输入的参数来确定位数,可使用str作为输入来构建对象,

示例如下:

decimal.Decimal(str(sheet_obj.cell_value(row, 16)))

问题2:四舍五入的使用

需求为对一个decimal类型的数进行四舍五入的取整,

示例如下:

decimal.Decimal(raw_value).quantize(decimal.Decimal('1.'), rounding="ROUND_HALF_UP")

python中的decimal类型

引入

在做一道很基础的python题的时候,老师提醒我可以用到decimal类型进行优化。

原题是这样的:

分析一下程序的输出结果,说明出现该结果的原因,应该如何修改程序

x=2.1 
y=2.0
if x-y==0.1: 
    print("Equal")
else: 
    print("Not Equal")
    
print(x-y)

程序会输出"Not Equal"

原因解释 

所以,条件判断 x-y==0.1 会返回 False,因此程序会执行 print("Not Equal")

接下来,程序执行 print(x-y) 来输出 xy 的差,这会显示一个非常接近 0.1 的浮点数,但它并不等于精确的 0.1,这是因为浮点数在计算机内部以二进制表示,有时无法准确地表示十进制小数。

这时,老师提醒我可以运用decimal类型进行优化,下面我为大家整理了decimal类型的大致内容:

decimal 类型

在 Python 中,decimal 类型是用于高精度的十进制浮点数运算的数据类型。它属于 Python 标准库中的 decimal 模块,可以用于处理需要高精度计算的场景,尤其是在涉及到金融、科学计算、精确度要求较高的计算任务时非常有用。

decimal 类型的特点和用途包括:

要使用 decimal 类型,你需要导入 decimal 模块,并使用 Decimal 构造函数来创建 decimal 对象。例如:

from decimal import Decimal
 
x = Decimal('0.1')
y = Decimal('0.2')
result = x + y

在这个示例中,xydecimal 类型的对象,它们可以进行精确的加法运算,避免了浮点数的精度问题。

运用

运用decimal类型,修改最开始的代码可以得到:

from decimal import Decimal
 
x = Decimal('2.1')
y = Decimal('2.0')
 
if x - y == Decimal('0.1'):#0.1要用字符串格式,不然输入进去的0.1仍然不是0.1
    print("Equal")
else:
    print("Not Equal")
 
print(x - y)

同时我将附上另外两种解决方案,供读者参考

#将相减之后的数进行四舍五入,把后面由浮点数带来的不精确的值给抹去
x=2.1 
y=2.0
z=round(x-y,1)
if z==0.1: 
    print("Equal")
else: 
    print("Not Equal")
#创立最小误差进行比较
x = 2.1
y = 2.0
epsilon = 1e-10
if abs(x - y - 0.1) < epsilon:
    print("Equal")
else:
    print("Not Equal")

总结 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文