请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我需要匹配所有这些开始标记:
<p>
<a href="foo">
Run Code Online (Sandbox Code Playgroud)
但不是这些:
<br />
<hr class="foo" />
Run Code Online (Sandbox Code Playgroud)
我想出了这个,并希望确保我做对了.我只抓住了a-z.
<([a-z]+) *[^/]*?>
Run Code Online (Sandbox Code Playgroud)
我相信它说:
/,然后我有这个权利吗?更重要的是,你怎么看?
我不知道这是否是一个明显的错误,但是在运行Python脚本来改变模拟的参数时,我意识到缺少delta = 0.29和delta = 0.58的结果.经过调查,我注意到以下Python代码:
for i_delta in range(0, 101, 1):
delta = float(i_delta) / 100
(...)
filename = 'foo' + str(int(delta * 100)) + '.dat'
Run Code Online (Sandbox Code Playgroud)
为delta = 0.28和0.29生成相同的文件,与.57和.58相同,原因是python返回float(29)/ 100为0.28999999999999998.但这不是一个系统性的错误,在某种意义上它并不是每个整数都会发生的.所以我创建了以下Python脚本:
import sys
n = int(sys.argv[1])
for i in range(0, n + 1):
a = int(100 * (float(i) / 100))
if i != a: print i, a
Run Code Online (Sandbox Code Playgroud)
而且我看不到发生此舍入错误的数字中的任何模式.为什么这些特定数字会发生?
可能重复:
Python舍入错误与浮点数
python数学是错误的
我不能让Python正确地做减法1 - 0.8并分配它.它一直提出错误的答案,0.19999999999999996.
我探讨了一下:
sq = {}
sub = {}
for i in range(1000):
sq[str(i/1000.)+'**2']=((i/1000.)**2)
sub['1-'+str(i/1000.)]=(1.0-(i/1000.))
Run Code Online (Sandbox Code Playgroud)
并发现这个错误发生在0到1到第三个小数位之间的一个随机的浮点组.当您对这些浮点数进行平方时,也会发生类似的错误,但会出现类似的错误.
我希望对此有一个解释,以及如何使Python正确运算.使用round(x,3)是我现在使用的解决方法,但它并不优雅.
谢谢!
这是我的Python 2.7.3 shell中的一个会话:
*** Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32. ***
*** Remote Python engine is active ***
>>> 1-0.8
0.19999999999999996
>>> print 1-0.8
0.2
>>> a = 1-0.8
>>> a
0.19999999999999996
>>> print a
0.2
>>> a = 0.2
>>> print a
0.2
>>> a
0.2
>>> …Run Code Online (Sandbox Code Playgroud) 我只是使用python作为计算,我看到了这一点
Python 2.7.3 (default, Aug 1 2012, 05:14:39)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 62 * 41.2 * 2 / 250
20.435200000000002
>>> 62 * 4.12 * 2 / 25
20.4352
>>>
Run Code Online (Sandbox Code Playgroud)
只是为了确保我通过gcc解雇了以下代码,但这并未向我显示上述行为.我知道这可能是四舍五入的事情,但应该是统一的.为什么python在数学上加起来跟踪00000000002它不应该在那里.
C/C++代码
#include <stdio.h>
int main () {
printf ("%lf %lf \n", 62 * 41.2 * 2 / 250, 62 * 4.12 * 2 / 25);
}
Run Code Online (Sandbox Code Playgroud)
结果是
20.435200 20.435200
如果有人对特定数字感到好奇,他们属于一些引擎位移计算比较:)
我正在尝试将十进制数字添加到十进制数字并且它正常工作,但是当我这样做时,1.1 + 0.1我得到1.2000000000000002但是我希望它等于是1.2.当我这样做的时候,1.0 + 0.1我会得到1.1哪个是完美的,但我不会那样做1.1 + 0.1.那么有什么方法可以摆脱000000000000002来自1.2000000000000002?
谢谢.
可能重复:
带有浮点数的Python舍入错误
我用numpy创建了一个数组a = numpy.arange(0,1e5,1,dtype=int).a[18645]是预期的18645.当我创建另一个数组时b=a*10e-15,b[18645]是186.4999999999e-12.b[18644]是186.44e-12.为什么Python会创建这些尾随9?
当我试图在数组中搜索元素时出现了这个问题numpy.where.使用尾随的9s,该numpy.where功能未能找到184.45e-12 in b.
我不是在寻找我的代码的修复,我想了解什么机制导致我的列表定期填充不正确的数据.
x = []
h = 0.01
for i in range(101):
x.append(1+i*h)
print x
"""
~$ python ~/dev/python/inf1100/coor1.py
[1.0, 1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 1.13, 1.1400000000000001, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33, 1.34, 1.35, 1.3599999999999999, 1.37, 1.38, 1.3900000000000001, 1.4, 1.4100000000000001, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5, 1.51, 1.52, 1.53, 1.54, 1.55, 1.56, 1.57, 1.58, 1.5899999999999999, 1.6, 1.6099999999999999, …Run Code Online (Sandbox Code Playgroud) 按照我的预期.05 + .01应该等于.06但是在python中它不会发生.因为.05+.01 = 0.060000000000000005而且不等于.06.
>>> .01+.01
0.02
>>> .02+.01
0.03
>>> .03+.01
0.04
>>> .04+.01
0.05
>>> .05+.01
0.060000000000000005 #expected .06
>>> .06+.01
0.06999999999999999 #expected .07
>>> .07+.01
0.08
>>> .08+.01
0.09
>>> .09+.01
0.09999999999999999 #expected .10
>>> 0.09999999999999999+.01
0.10999999999999999 #expected .11
Run Code Online (Sandbox Code Playgroud)
这是什么原因?
我在python中尝试了这个简单的数学运算
>>> math.floor(8.2-0.21)
7.0
>>> math.floor(8.21-0.2)
8.0
>>> math.floor(8.2-0.2)
7.0
Run Code Online (Sandbox Code Playgroud)
第三个应该返回8但是返回7?!
UPDATE
我在PHP,ruby和JAVA中尝试过,我得到了相同的结果.
更新2 我不知道为什么这个问题得到很多投票!
为什么不1000?结果是float,因为PEP238中的" 真正分裂的语义 " ,但是.这令人困惑.我有这样的假设,实际答案就像999.9999999123564384,但如何检查呢?和BTW.math.float(999.999999999999999) = 100010 / .01 = 1000.0
我的问题更多是关于为什么在C++,C#和VB中
std::cout<<2.2f*3.0f<<std::endl; //prints 6.6
Run Code Online (Sandbox Code Playgroud)
在Python,Java和Ruby中
2.2*3.0 //prints 6.6000000000000005
Run Code Online (Sandbox Code Playgroud)
我对内存中的浮点表示非常熟悉.我检查过,事实上2.2无法用单精度精确表示在内存中.
但是为什么C++,C#和VB在打印值时会切断结果中不相关的部分而其他部分却没有?
python ×10
math ×2
python-2.7 ×2
append ×1
decimal ×1
html ×1
numbers ×1
numpy ×1
python-3.x ×1
regex ×1
subtraction ×1
xhtml ×1