JavaScript中的所有数学函数都使用弧度代替度。 然而,他们要么不平等,要么我偏离基础。
从度数到弧度的转换是:
var rad = angle * Math.PI / 180
90度角equals 1.57079633弧度
90度角的余弦equals 0 余弦为1.57079633弧度equals -3.20510345×10-9。
请注意,在Javascript中,所有操作都是一步完成的,以避免舍入错误:
var cos = Math.cos(angle * Math.PI / 180);
我显然在这里遗漏了一些明显的东西,但男孩却搞砸了代码。
答案 0 :(得分:11)
一切都在一步完成,以避免舍入错误
如何避免舍入错误?它只是意味着舍入错误在单独的变量中不可用,这就是全部。
pi的 true 值无法准确表示为浮点数,因此pi / 2的真值也不能。所以你不能给Math.cos
得到0所需的确切值。但是嘿--10 -9 是非常非常小的数字。这意味着如果你画了一条长10,000公里的线,你最终会偏离相关轴1厘米。
这正是处理浮点数时应该期待的事情。不要与平等进行比较 - 在一定的容忍度内进行比较。
答案 1 :(得分:1)
总会出现舍入错误。并且浮点数在数学上并不准确,它只能精确到一定数量的有效数字。
更改代码,以便在错误达到1/1000000000时不会“搞砸”。
答案 2 :(得分:1)
对于我们大多数人在计算机上执行严重的总计0 IS 等于-3.20510345×10 ^ -9到您在使用浮点时有权期望的任何合理程度的准确度数字。这是SO上定期讨论的主题。
答案 3 :(得分:1)
是的,你只是丢失了类型转换的数据。
以弧度为单位的90度并不等于1.57079633。如果有更多小数位,那将按预期直接转换回来。
你总是要小心这样的事情。如上所述,10 ^ -9足够接近于零。
也取自MSDN:
此外,由于Double类型的精度损失,使用Double值的算术和赋值操作的结果可能会因平台而略有不同。例如,在32位和64位版本的.NET Framework中,分配文字Double值的结果可能不同。下面的示例说明了将文字值-4.42330604244772E-305和值为-4.42330604244772E-305的变量分配给Double变量时的差异。请注意,在这种情况下,Parse(String)方法的结果不会损失精度。
答案 4 :(得分:0)
在计算机中,π/ 2弧度不能完全等于90度,因为π是无限长的数。因此,除非计算机是∞位,否则不能指望用π进行完美的预测。
答案 5 :(得分:-3)
我刚刚意识到:
-3.20510345×10-9与-0.00000000320510345相同,非常接近于零。
谷歌转换为弧度是四舍五入的,而这种舍入会导致错误。
我的猜测是因为数字缺乏精确性而臭名昭着的Javascript也会产生不正确的弧度,因此它的cosign就不用了。
不知道如何解决这个问题 - 舍入是不可接受的,因为这对其他角度不起作用。