Sin和ToRadians的Java奇怪行为

Pez*_*kow 10 java

我已经被赋予了使用java来生成Sin表的任务,但是对于某些输入值,我似乎得到了一些非常奇怪的结果.我使用下面的

System.out.println("| sin(" + currentPoint + ") = " + Math.sin(Math.toRadians(currentPoint)));
Run Code Online (Sandbox Code Playgroud)

Where(int)currentPoint是一个以为单位的值(例如90)

这些结果我觉得很奇怪

| sin(360) = -2.4492935982947064E-16
| sin(180) = 1.2246467991473532E-16
| sin(150) = 0.49999999999999994
| sin(120) = 0.8660254037844387
Run Code Online (Sandbox Code Playgroud)

期待

sin(360) = 0
sin(180) = 0
sin(150) = 0.5
sin(120) = 0.866025404
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Pau*_*bel 7

You're dealing with floating point numbers, looking for exact answers isn't going to work for all values. Take a look at What Every Computer Scientist Should Know About Floating-Point Arithmetic. You want your tests to be equivalent to your expectations within some delta. Note that the answers you're getting are pretty close. It's expressing values in bits that's biting you.

From the link:

将无限多个实数压缩成有限数量的比特需要近似表示.尽管存在无限多个整数,但在大多数程序中,整数计算的结果可以以32位存储.相反,给定任何固定数量的位,大多数具有实数的计算将产生无法使用那么多位精确表示的量.因此,浮点计算的结果通常必须舍入,以便适应其有限表示.该舍入误差是浮点计算的特征.