php (0.1 0.7)10,int((0.1 + 0.7)* 10)= 7在几种语言。 如何防止这一点?

int((0.1 + 0.7)* 10)= 7在几种语言。 如何防止这一点?

最近我遇到了几种语言的错误/function。 我有一个非常基本的知识,它是如何引起的(我想要一些详细的解释),但是当我想到我多年来一直想要的所有错误时,问题是我怎样才能确定“ 嘿,这可能会导致一个riddiculous的错误,我最好使用任意的精度函数 “,其他语言有这个错误(和那些谁不, 为什么 )。 另外,为什么0.1 + 0.7这样做,即0.1 + 0.3没有,还有其他众所周知的例子吗?

PHP

//the first one actually doesn't make any sense to me, //why 7 after typecast if it's represented internally as 8? debug_zval_dump((0.1+0.7)*10); //double(8) refcount(1) debug_zval_dump((int)((0.1+0.7)*10)); //long(7) refcount(1) debug_zval_dump((float)((0.1+0.7)*10)); //double(8) refcount(1)

python:

>>> ((0.1+0.7)*10) 7.9999999999999991 >>> int((0.1+0.7)*10) 7

使用Javascript:

alert((0.1+0.7)*10); //7.999999999999999 alert(parseInt((0.7+0.1)*10)); //7

ruby:

>> ((0.1+0.7)*10).to_i => 7 >>((0.1+0.7)*10) => 7.999999999999999

计算机科学家应该知道什么是浮点运算

这不是一个语言问题。 这是浮点运算的一般问题。

停止使用浮游物 。 不完全是。

数字的浮点表示不准确 。

在Python中, int截断向零移动到最接近的整数。 (int) ,Javascript中的parseInt和Ruby中的to_i做同样的事情。

这不是一个错误; 这些function是如何工作的。

例如,从Python的int 文档 :

浮点数转换为整数截断(趋近于零)。

这是一个与浮点表示有关的已知问题,您可以从中find更多信息:

具体的问题是7.9会直接转换(trunc)到7,同时将其转换为int。 在Python中你可以用下面的方法解决

int( round(((0.1+0.7)*10)) )

…在其他语言中也是如此

但是,是的,在许多情况下这可能是一个问题。 例如,浮点数对于工资计划来说不够可靠。

也许别人可以给你其他提示。 无论如何,这个帮助。

使用decimal模块:

>>> int((decimal.Decimal('0.1')+decimal.Decimal('0.7'))*10) 8

PHP默认使用浮点数,你需要手动转换为整数。

你应该知道浮点运算。 这里的其他post提供了足够的链接。

就我个人而言,我使用round / ceil / float取决于我期望的而不是int

$a = (int) round((0.7 + 0.1) * 10);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值