约等于 3.1406
但是 用 python 计算出的值是错误的
In [1]: from math import sqrt
In [2]: ((1+1/sqrt(2))/2 + sqrt(1/sqrt(2)))**2 / 4*(0.25-(1-((1+1/sqrt(2))/2))**2)
Out[2]: 0.16405334649243114
约等于 3.1406
但是 用 python 计算出的值是错误的
In [1]: from math import sqrt
In [2]: ((1+1/sqrt(2))/2 + sqrt(1/sqrt(2)))**2 / 4*(0.25-(1-((1+1/sqrt(2))/2))**2)
Out[2]: 0.16405334649243114
发现分开计算分子分母 再做除法 就正确
合在一起就不行 什么鬼
In [1]: from math import sqrt
In [2]: a = ((1+1/sqrt(2))/2 + sqrt(1/sqrt(2)))**2
In [3]: b = 4*(0.25-(1-((1+1/sqrt(2))/2))**2)
In [4]: a
Out[4]: 2.8711601445348967
In [5]: b
Out[5]: 0.914213562373095
In [6]: a/b
Out[6]: 3.1405792505221686
In [7]: ((1+1/sqrt(2))/2 + sqrt(1/sqrt(2)))**2 / 4*(0.25-(1-((1+1/sqrt(2))/2))**2)
Out[7]: 0.16405334649243114
个人感觉还是尽量用括号来明确指定运算顺序比较好
正确结果:2.8711601445348967 / (4*(0.25-(1-((1+1/sqrt(2))/2))**2))
您提问中的错误结果:2.8711601445348967 / 4*(0.25-(1-((1+1/sqrt(2))/2))**2)
另外编程过程中应该尽量注意数据类型一致,比如您代码中的整数应该用浮点数代替,比如1用1.
代替2用2.
代替
傻眼了 还真是打错了…想找地缝钻进去
刚才突然想到浮点数精度问题 还自以为找到原因了 原来是这样…
我用的 python3 应该默认是小数除法
默认归默认,但中间还是会就进行自动的类型转换,实际编程中进行自动类型转换一不小心就会留坑.
所以要么保持数据类型一致且不期望发生转换,要么就手动转换.
当然就具体您这个例子而言这么用没问题,但确保保持数据类型一致是避免坑的好习惯.
数据单位一致性,这种问题很大的。
尤其是统计什么时效之类的,一不小心就偏离了。
谢谢建议 前段时间学了 golang 以后对静态语言也有了一点了解