Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python、与变量不同的舍入和硬编码值_Python_Rounding Error - Fatal编程技术网

Python、与变量不同的舍入和硬编码值

Python、与变量不同的舍入和硬编码值,python,rounding-error,Python,Rounding Error,我有一个简单的数学公式,结果是一个十进制数(0.97745),我想四舍五入到4个数字。 当我从求值变量中得到(0.9774)时,但当我将该数字硬编码到函数round()中时,得到0.9775 这是密码 zero = 0.9700 effective_beta = 0.00745 loan = {} loan['beta2'] = 0.0 loan['beta3'] = 0.0 mrktdiff_2 =0.08880400 mrktdiff_3 = 0.026463592000 forecas

我有一个简单的数学公式,结果是一个十进制数(0.97745),我想四舍五入到4个数字。 当我从求值变量中得到(0.9774)时,但当我将该数字硬编码到函数round()中时,得到0.9775

这是密码

zero = 0.9700
effective_beta = 0.00745
loan = {}
loan['beta2'] = 0.0
loan['beta3']  = 0.0
mrktdiff_2 =0.08880400
mrktdiff_3 = 0.026463592000

forecasted_pt = (float(zero) + float(effective_beta) + float(loan['beta2'] or 0.) * float(mrktdiff_2) +
                              float(loan['beta3'] or 0.) * float(mrktdiff_3))
                          
print("before rounding forecastedpt is ")
print(forecasted_pt)
print("after rounding")
print(round(forecasted_pt,4))
print("Dont get this part")
print(round(0.97745,4))
我之所以使用浮点运算符,是因为这些变量是动态的,有时会导致字符串/空值

同样,当我在php中运行相同的代码时,我得到了0.9775的值

编辑: 我在katacoda.com编辑器中运行了代码,得到以下结果:

before rounding forecastedpt is
0.97745
after rounding
0.9774
Dont get this part
0.9775
但是在repl.com中运行它,我得到的第一个值是:0.9774499999999,所以我猜它可能与表达式本身的精度相同

zero = 0.9700
effective_beta = 0.00745
loan = {}
loan['beta2'] = 0.0
loan['beta3']  = 0.0
mrktdiff_2 =0.08880400
mrktdiff_3 = 0.026463592000

forecasted_pt = (float(zero) + float(effective_beta) + float(loan['beta2'] or 0.) * float(mrktdiff_2) + float(loan['beta3'] or 0.) * float(mrktdiff_3))

print("before rounding forecastedpt is ")
print(forecasted_pt)
print("after rounding")
print(round(forecasted_pt,5))
numb = round(forecasted_pt,5)
print(round(numb,4))
print("Dont get this part")
print(round(0.97745,4))
输出:

before rounding forecastedpt is 
0.9774499999999999
after rounding
0.97745
0.9775
Dont get this part
0.9775
任何语言中的round函数都不会对其所有数字进行四舍五入,而是只对其最后一个数字进行四舍五入。

来自python:

注意:浮动的round()行为可能令人惊讶:例如,round(2.675,2)给出的是2.67,而不是预期的2.68。这不是一个错误:这是因为大多数小数不能精确地表示为浮点。有关更多信息,请参阅:问题和限制。

尝试以下方法: 我记得10年前在统计课上。我的教授一直建议我们把计算结果四舍五入到小数点后6位,因为统计学都是关于估计的,它很重要

zero = 0.9700
effective_beta = 0.00745
loan = {}
loan['beta2'] = 0.0
loan['beta3']  = 0.0
mrktdiff_2 =0.08880400
mrktdiff_3 = 0.026463592000

forecasted_pt = round((float(zero) + float(effective_beta) + float(loan['beta2'] or 0.) * float(mrktdiff_2) + float(loan['beta3'] or 0.) * float(mrktdiff_3)),6)


print(round(forecasted_pt,4))