小学数学题,求解惑

Python/PHP/Perl 开发与设计
回复
头像
nyfair
帖子: 1065
注册时间: 2007-12-07 12:49
系统: winnux10
来自: Tree New Bee
送出感谢: 2 次
接收感谢: 13 次

小学数学题,求解惑

#1

帖子 nyfair » 2013-11-07 18:19

/bin/python2

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


上面的结果应该是正常的,下面的是怎么出来的?
本人在此论坛仅负责吐槽,问题急需解决请支付宝转账5毛至{我的id@qq.com},将会竭诚为您服务

linux常见多媒体问题处理指南

1. 视频播放有问题->卸载gstreamer
2. 音频播放有问题->卸载pulseaudio
3. 远程播放有问题->卸载avahi
4. 系统全都有问题->卸载systemd,远离Lennart这傻逼让你从此轻松自在

⇩自由网络⇩
https://github.com/nyfair/freeweb
jusss
帖子: 19
注册时间: 2013-07-14 17:06
系统: xxoo
送出感谢: 1 次
接收感谢: 0

Re: 小学数学题,求解惑

#2

帖子 jusss » 2013-11-07 18:26

留名。。。。。。。。。
头像
nyfair
帖子: 1065
注册时间: 2007-12-07 12:49
系统: winnux10
来自: Tree New Bee
送出感谢: 2 次
接收感谢: 13 次

Re: 小学数学题,求解惑

#3

帖子 nyfair » 2013-11-07 18:27

jusss 写了:留名。。。。。。。。。
小学生家长你壕
本人在此论坛仅负责吐槽,问题急需解决请支付宝转账5毛至{我的id@qq.com},将会竭诚为您服务

linux常见多媒体问题处理指南

1. 视频播放有问题->卸载gstreamer
2. 音频播放有问题->卸载pulseaudio
3. 远程播放有问题->卸载avahi
4. 系统全都有问题->卸载systemd,远离Lennart这傻逼让你从此轻松自在

⇩自由网络⇩
https://github.com/nyfair/freeweb
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux
送出感谢: 6 次
接收感谢: 68 次

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

#4

帖子 susbarbatus » 2013-11-07 18:33

拆开来看就知道了

代码: 全选

>>> def minus(oo,xx):
...  return oo-xx
... 
>>> minus(1.0,0.99)
0.010000000000000009
>>> print(0.010000000000000009)
0.01
沉迷将棋中……
头像
roylez
论坛版主
帖子: 1928
注册时间: 2005-10-04 10:59
来自: 上海
送出感谢: 0
接收感谢: 1 次

Re: 小学数学题,求解惑

#5

帖子 roylez » 2013-11-07 19:04

因为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
弄个dropbox空间来备份文件或者做私人代码服务器
配置:[url]git://github.com/roylez/dotfiles.git[/url]
主页:http://roylez.heroku.com
各种稀奇玩意儿:http://dooloo.info
头像
qy117121
论坛版主
帖子: 49946
注册时间: 2007-12-14 13:40
系统: Winbuntu
来自: 志虚国乌由市
送出感谢: 17 次
接收感谢: 336 次
联系:

Re: 小学数学题,求解惑

#6

帖子 qy117121 » 2013-11-07 21:54

roylez 写了:因为python是渣渣
:em05
来自冷轩信的 小叽叽
渠月 · QY    https://vz.rs/u
本人只会灌水,不负责回答问题

无聊可以点一下→ http://u.nu/ubuntu
nae6taiyie0T
帖子: 482
注册时间: 2013-09-13 0:42
系统: Debian sid
送出感谢: 0
接收感谢: 46 次

Re: 小学数学题,求解惑

#7

帖子 nae6taiyie0T » 2013-11-07 22:09

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这款软件. 简约, 强大, 优雅!
mophisays
帖子: 64
注册时间: 2014-01-06 10:35
系统: xUbuntu
送出感谢: 0
接收感谢: 1 次

Re: 小学数学题,求解惑

#8

帖子 mophisays » 2014-05-16 16:18

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中,通常进行符号计算,所以不容易被注意到,
其实多迭代几次数值计算,就会发现,精度问题也挺严重。
两间东倒西歪屋
一个南腔北调人
头像
yq-ysy
论坛版主
帖子: 3710
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)
送出感谢: 0
接收感谢: 79 次

Re: 小学数学题,求解惑

#9

帖子 yq-ysy » 2014-05-18 8:21

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 就可以准确的表述 ).
回复

回到 “Python/Php/Perl”