VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • python中关于decimal使用出现的一些问题

这篇文章主要介绍了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,分别赋值为 2.1 和 2.0。
然后,程序执行条件判断 x-y0.1,这个条件判断是否 x 和 y 的差是否等于 0.1。
由于浮点数的精度问题,2.1 - 2.0 并不等于精确的 0.1,而是一个非常接近 0.1 的浮点数。
所以,条件判断 x-y
0.1 会返回 False,因此程序会执行 print("Not Equal")。

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

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

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

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

高精度计算: decimal 类型可以表示高精度的十进制数,避免了浮点数的精度问题。这对于需要准确表示小数或进行精确计算的任务非常重要。
避免浮点数问题: 浮点数(float 类型)在计算机内部以二进制表示,有时无法精确表示十进制小数,可能会导致精度损失和舍入错误。decimal 类型解决了这个问题。
可控的精度: decimal 允许你控制小数点后的位数,以满足特定的精度要求。这对于需要特定位数的小数结果的应用非常有用。
支持各种数学运算: 与 decimal 类型一起使用的数学运算和函数可以提供高精度的结果,包括加法、减法、乘法、除法以及各种数学函数(如平方根、对数等)。
支持上下文控制: 你可以使用 decimal 模块中的上下文对象来配置精度、舍入规则和其他行为,以满足特定需求。
精确的货币计算: 由于 decimal 类型可以精确表示货币值,它在金融领域的应用非常广泛,因为涉及到货币的计算需要高精度和可预测的结果。
要使用 decimal 类型,你需要导入 decimal 模块,并使用 Decimal 构造函数来创建 decimal 对象。例如:

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

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

运用
运用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")

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

原文链接:https://blog.csdn.net/ahengheng365/article/details/131865087


相关教程