2 u010794180 u010794180 于 2014.12.20 08:59 提问

为什么同样的运算方式结果不一样,内部怎么处理的。 1C

今天自己实现了一个计算器,也用来系统的计算法,发现有个奇怪的东西。
(1/3)*3 和式子1/3*3
现实中我们认为运算方式是一样的,按照逆波兰式的运算顺序,其实也应该一样。我对于无限循环小数都和计算器一样取小数点 后9位。可是前置算出来0.999999999后者是1。想咨询下后者是不是对内部进行优化特殊处理了。还有类似的情况举个例子介绍下~谢谢大家

4个回答

devmiao
devmiao   Ds   Rxr 2014.12.20 09:25

因为1/3对于C语言、C#和Java来说是整除
要写 1.0 / 3.0
或者(double)1/(double)3

u010794180
u010794180 我很想知道内部储存和运算顺序,可以进一步说明吗?我用java
3 年多之前 回复
mayh554024289
mayh554024289   2014.12.20 15:23

不知道你用的啥语言,反正C与C++都会得到0

bdmh
bdmh   Ds   Rxr 2014.12.20 15:40

这是浮点数运算的问题,首先浮点算存储就和其他数值不一样,然后而且计算的先后顺序也会导致误差的积累

u010794180
u010794180 我很想知道内部储存和运算顺序,可以进一步说明吗?我用java
3 年多之前 回复
zilaishuichina
zilaishuichina   Rxr 2014.12.22 11:09

lz贴一下具体代码吧, 这要看你取小数点后第9位,是怎么取的了,

如果(1/3)*3

其中的(1/3)你也取了第9位,那就变成了是 0.333333333 * 3, 这个是有精度丢失的

如果是 1/3*3 整个的结果取第9位, 那就是1.0000000000 取第9位, 还是1

u010794180
u010794180 首先谢谢你的回复。为什么1除以3乘以3会等于1.000000000,而(1除以3)乘以3就等于0.999999999?我以后的是有没有加括号其实都是先算1除以3,可是为什么结果不一样
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!