除法结果不正确
Incorrect division results
我有一个时间计算器,已经用了好几年了。但是,有一件事一直困扰着我,那就是如果使用小数秒,结果就会成为浮点"错误"的受害者。所以,我最近转而使用这个BigDecimal库。
现在,我得到数学错误。以下是我今天收到的一个bug报告中的一个简化测试用例:27436 / 30418
返回1
,而不是预期的0.9019659412190151
。
为了说明我的问题,这里有一个Chrome中的Javascript控制台会话:
> first = 27436
27436
> second = 30418
30418
> first / second
0.9019659412190151 // expected result, but using JS numbers, not BigDecimals
> firstB = new BigDecimal(first.toString())
o
> secondB = new BigDecimal(second.toString())
o
> firstB / secondB
0.9019659412190151 // this is a JS number, not a BigDecimal, so it's susceptible to the problems associated with floating-point.
> firstB.divide(secondB)
o // BigDecimal object
> firstB.divide(secondB).toString()
"1" // huh? Why 1?
> firstB.divideInteger(secondB).toString()
"0"
可以看到,divide()
方法没有产生我期望的结果。我需要做些什么改变?
这里有一些更多的细节,作为对评论的回应。
首先,一些人认为使用BigDecimal是多余的。可能吧,但我认为在做决定之前有必要了解更多细节。这个应用程序是一个时间计算器,所以有一些事情促使我切换到BigDecimal。首先,因为这是一个计算器,向用户显示正确答案很重要。如果用户输入0.1 s + 0.2 s
,他们期望的答案是0.3 s
,而不是Javascript将显示给他们的答案(0.30000000000000004
)。
我真的不想限制精度超出我可以在JS中使用,所以我可以使用整数,因为我不知道我的用户需要的最大精度。我想,大多数人从不使用小数秒,但从我收到的电子邮件来看,有些人使用小数秒。我目前在内部存储所有的时间为秒。
有人建议我将数字存储为精确分数。不幸的是,我不知道那是什么意思。也许是因为我不太懂数学。我的知识还不足以建立我自己的数学图书馆;这就是我使用BigDecimal的原因。它已经存在很长时间了,所以我不敢说我的问题是由于BigDecimal中的一个错误。我更怀疑是我使用它的方式有问题。
最后,我并不是特别执着于BigDecimal。我愿意接受其他的建议,只要我能用它们来弥补我的数学缺陷。
标题>我还没有在任何生产代码中使用BigDecimal,但发现这个问题很有趣,所以我想尝试一下。关于需要MathContext
作为除法函数的参数,您是正确的。下面是我根据你的例子所做的:
console.log(firstB.divide(secondB, new MathContext(100)).toString());
创建一个上下文,告诉BigDecimal在科学模式中使用100位数字:
0.9019659412190150568742192123085015451377473864159379314879347754618975606548754027220724570977710566
也有选项来控制不同的输出模式PLAIN
, SCIENTIFIC
和ENGINEERING
+各种四舍五入模式。
关于jsfiddle的完整示例
更新:默认的输出格式是SCIENTIFIC
,而不是PLAIN
。例子
在这里创建了一个小的性能测试,看起来BigDecimal比原生javascript除法慢10000倍。
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- Amazon S3 REST API大小不正确
- 元素值比较的结果不正确
- 自定义查询字符串分析器返回不正确的结果
- 检查所选值之间的值,结果不正确
- 如果语句给出不正确的结果
- 反向地理编码结果不正确
- 算术给出不正确的结果
- 日期() 结果不正确
- 使用点后有四位数字的十进制值计算中的结果不正确
- Javascript数学给出了不正确的结果,我该如何解决这个问题
- Javascript函数indexOf返回不正确的结果
- 除法结果不正确
- JavaScript计算结果不正确
- 为什么我的$(选择器).索引(过滤器选择器)返回不正确的结果
- 当视图从操作结果返回时,选择2脚本不正确渲染
- $(“#id”).val();显示不正确的结果
- 使用用户输入的Javascript梯形区域计算,结果不正确
- 简单的javascript十进制加法会产生不正确的结果
- 在另一个函数中返回一个函数的结果会产生不正确的结果