分页: 1 / 1

小学数学题,求解惑

发表于 : 2013-11-07 18:19
nyfair
/bin/python2

>>> 1.0-0.99
0.010000000000000009
>>> def minus(oo,xx):
... return oo-xx
...
>>> print(minus(1.0,0.99))
0.01


上面的结果应该是正常的,下面的是怎么出来的?

Re: 小学数学题,求解惑

发表于 : 2013-11-07 18:26
jusss
留名。。。。。。。。。

Re: 小学数学题,求解惑

发表于 : 2013-11-07 18:27
nyfair
jusss 写了:留名。。。。。。。。。
小学生家长你壕

Re: 小学1年级数学题,求解惑

发表于 : 2013-11-07 18:33
susbarbatus
拆开来看就知道了

代码: 全选

>>> def minus(oo,xx):
...  return oo-xx
... 
>>> minus(1.0,0.99)
0.010000000000000009
>>> print(0.010000000000000009)
0.01

Re: 小学数学题,求解惑

发表于 : 2013-11-07 19:04
roylez
因为python是渣渣

代码: 全选

[1]  main > def minus(oo,xx)
[1]  main *   oo - xx
[1]  main * end
=> nil
[2]  main > minus(1.0, 0.99)
=> 0.010000000000000009
[3]  main > 1.0 - 0.99
=> 0.010000000000000009

Re: 小学数学题,求解惑

发表于 : 2013-11-07 21:54
qy117121
roylez 写了:因为python是渣渣
:em05
来自冷轩信的 小叽叽

Re: 小学数学题,求解惑

发表于 : 2013-11-07 22:09
nae6taiyie0T
roylez 写了:因为python是渣渣

代码: 全选

[1]  main > def minus(oo,xx)
[1]  main *   oo - xx
[1]  main * end
=> nil
[2]  main > minus(1.0, 0.99)
=> 0.010000000000000009
[3]  main > 1.0 - 0.99
=> 0.010000000000000009
跟python没什么关系.

这是计算机本身的问题.
数值计算, 在当前的计算机架构下, 有一个精确度的问题.
除非为数值计算做特别优化( 比如像mathematica, matlab这样的专业软件, 或者像scheme等编程语言中), 一般的编程语言都存在精确度问题.

不信的话, 你可以用javascript来算一下: 1.0 - 0.99, 得到的结果是类似的.
当然了, python有专门的数学方面的模块, 用这些模块可以实现精确的数值计算.

另外, 楼主第一贴出, 使用print是有问题的, 因为print会对数值进行处理, 不信的话可以试试:

代码: 全选

 >> print(1.0 - 0.99)
>> 1.0 - 0.99
跟你是否定义minus()函数没什么关系, 只是print()引起的误会.

另外, 如果需要让孩子们在计算机上玩数学/学数学的话, 在下强烈推荐mathematica这款软件. 简约, 强大, 优雅!

Re: 小学数学题,求解惑

发表于 : 2014-05-16 16:18
mophisays
nae6taiyie0T 写了:
roylez 写了:因为python是渣渣

代码: 全选

[1]  main > def minus(oo,xx)
[1]  main *   oo - xx
[1]  main * end
=> nil
[2]  main > minus(1.0, 0.99)
=> 0.010000000000000009
[3]  main > 1.0 - 0.99
=> 0.010000000000000009
跟python没什么关系.

这是计算机本身的问题.
数值计算, 在当前的计算机架构下, 有一个精确度的问题.
除非为数值计算做特别优化( 比如像mathematica, matlab这样的专业软件, 或者像scheme等编程语言中), 一般的编程语言都存在精确度问题.

不信的话, 你可以用javascript来算一下: 1.0 - 0.99, 得到的结果是类似的.
当然了, python有专门的数学方面的模块, 用这些模块可以实现精确的数值计算.

另外, 楼主第一贴出, 使用print是有问题的, 因为print会对数值进行处理, 不信的话可以试试:

代码: 全选

 >> print(1.0 - 0.99)
>> 1.0 - 0.99
跟你是否定义minus()函数没什么关系, 只是print()引起的误会.

另外, 如果需要让孩子们在计算机上玩数学/学数学的话, 在下强烈推荐mathematica这款软件. 简约, 强大, 优雅![/quote]

是的,现在数字计算机的框架下,浮点数计算普遍存在精度问题,
即使强大如Mathematica,或者极致如Axiom,也未能免俗。
不过在CAS中,通常进行符号计算,所以不容易被注意到,
其实多迭代几次数值计算,就会发现,精度问题也挺严重。

Re: 小学数学题,求解惑

发表于 : 2014-05-18 8:21
yq-ysy
mophisays 写了:
nae6taiyie0T 写了:
roylez 写了:因为python是渣渣

代码: 全选

[1]  main > def minus(oo,xx)
[1]  main *   oo - xx
[1]  main * end
=> nil
[2]  main > minus(1.0, 0.99)
=> 0.010000000000000009
[3]  main > 1.0 - 0.99
=> 0.010000000000000009
跟python没什么关系.

这是计算机本身的问题.
数值计算, 在当前的计算机架构下, 有一个精确度的问题.
除非为数值计算做特别优化( 比如像mathematica, matlab这样的专业软件, 或者像scheme等编程语言中), 一般的编程语言都存在精确度问题.

不信的话, 你可以用javascript来算一下: 1.0 - 0.99, 得到的结果是类似的.
当然了, python有专门的数学方面的模块, 用这些模块可以实现精确的数值计算.

另外, 楼主第一贴出, 使用print是有问题的, 因为print会对数值进行处理, 不信的话可以试试:

代码: 全选

 >> print(1.0 - 0.99)
>> 1.0 - 0.99
跟你是否定义minus()函数没什么关系, 只是print()引起的误会.

另外, 如果需要让孩子们在计算机上玩数学/学数学的话, 在下强烈推荐mathematica这款软件. 简约, 强大, 优雅![/quote]

是的,现在数字计算机的框架下,浮点数计算普遍存在精度问题,
即使强大如Mathematica,或者极致如Axiom,也未能免俗。
不过在CAS中,通常进行符号计算,所以不容易被注意到,
其实多迭代几次数值计算,就会发现,精度问题也挺严重。[/quote]

Python 3 文档(简体中文) 3.2.2 documentation
14. 浮点算术: 问题和限制
http://docspy3zh.readthedocs.org/en/latest/tutorial/floatingpoint.html

……摘录……原文有例子……
不幸的是, 大多数的十进制小数都无法严格的以二进制来表示. 
一个结果就是, 普遍来说, 你输入的十进制的小数, 通常只是以接近的二进制数表示.

……摘录……原文有例子……
在需要严格的数值表示时, 试试使用 decimal 模块,
这个模块实现了用于账目运算或更高精度时用到的数值算法.
另一种就是 fractions 模块, 它实现了基于有理数的算法 ( 所以 1/3 就可以准确的表述 ).