首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Math.pow(10,6) = 999999.999999在DG800安卓手机上

Math.pow(10,6) = 999999.999999在DG800安卓手机上
EN

Stack Overflow用户
提问于 2014-09-07 19:44:48
回答 2查看 304关注 0票数 2

我知道Math.pow(10,6)使用双倍来执行计算,这意味着精度不是绝对的。当前发布的Google身份验证程序使用以下代码计算代码:

代码语言:javascript
复制
int codeLength = 6;
....
int code = truncatedHash % (int) Math.pow(10, codeLength);

不幸的是,至少有两部安卓手机(请参阅google-认证者问题396)计算999999.9999999,这会导致不正确(不工作)的身份验证代码。

修复是已知的,它使用一个整数除数表,因为计数限制在10个可能的值(请参阅从问题中引用的修复)。

这里有一个问题:是应用程序程序员的错误还是库程序员的错误?应用程序程序员应该期望得到正确的结果(1000000)还是必须考虑有限的精度?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-09 14:16:43

是的,这是图书馆里的一个bug,应该报告。

Oracle for Math.pow()说:“如果这两个参数都是整数,则结果与将第一个参数提高到第二个参数的威力的数学结果完全相同,如果这个结果实际上可以精确地表示为一个双值。”

“整数”这个词在这里有着特殊的含义。双x是整数,如果是floor(x) == x

根据这个定义,10.0是一个“整数”,6.0也是,小于2^52的每一个整数都可以精确地表示为一个双值,因此Math.pow(10.0, 6.0)应该精确地等于1000000.0。

票数 2
EN

Stack Overflow用户

发布于 2014-09-07 19:54:54

它是“库程序员的错误”,错误地使用数学函数是初学者的错误,在包装应用程序时永远无法得到补偿--它的基本知识是,对浮点数类型的操作永远不会产生精确的结果,依赖于这些操作而不使用适当的增量--与内部合理值的比较是.非常糟糕。

我建议切换库--如果它有这样的缺陷,您可以相当肯定还有一些更多的,甚至可能是与安全相关的错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25714082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档