下一个代码给我结果5.999999999999998,但正确答案是6精密二郎
Alpha = math:acos((4*4 + 5*5 - 3*3)/(2*4*5))
Area = 1/2 * 4 * 5 * math:sin(Alpha)
是否有可能得到6?
下一个代码给我结果5.999999999999998,但正确答案是6精密二郎
Alpha = math:acos((4*4 + 5*5 - 3*3)/(2*4*5))
Area = 1/2 * 4 * 5 * math:sin(Alpha)
是否有可能得到6?
您遇到了如此普遍,它有自己的网站,What Every Programmer Should Know About Floating-Point Arithmetic问题。这个问题是由于浮点算法在市场上几乎所有支持FP算法的CPU都有效;这不是Erlang特有的。
如果经常浮点运算不给你你需要的精度和准确度,你可以使用高精度计算库而不是内置的算法。也许最知名的这样的库是GMP,但是你必须将它包装在NIFs中才能在Erlang中使用它。
有at least one pure-Erlang alternative,但我与它没有经验,所以我不能亲自背书。
计算是使用你的硬件标准的浮点运算来完成。有时会出现舍入错误。
你真的需要15位精度?
为了获得更“精确”的数值可以有多种选择:
> round(Area). % Will round to integer
6
或者你可以四舍五入到一些精密
round(Area * 10000000)/10000000.
6.0
如果目的是打印的价值,然后打印浮点数的默认输出会降低精度。
io:format("~f~n", [Area]).
6.000000
ok
或与特定精度
io:format("~.14f~n", [Area]).
6.00000000000000
ok
HTH
你不能保证使用浮点运算时,获得精确的结果。这个话题已经被很多很多次覆盖了。 – Nayuki