Java:使用`Math.sin()`时可能会损失精度

时间:2016-04-08 16:53:15

标签: java math trigonometry

我是Java新手。我想每隔15度打印出sincostan值。

public class W3Aufgabe5 {
    public static void main(String[] args) {

        System.out.printf("%6s%6s%6s%6s%n", "Angle", "Sin", "Cos", "Tan");
        System.out.println("------------------------");

        for (float angle = 0; angle <= 180; angle += 15) {

            float sin = Math.sin(Math.toRadians(angle));
            float cos = Math.cos(Math.toRadians(angle));
            float tan = Math.tan(Math.toRadians(angle));

            System.out.printf("%6d%6d%6d%6d%n", angle, sin, cos, tan);
        }
    }
}

对于每个Math.x()行,编译器打印

  

错误:可能损失精度
      要求:浮动
      发现:双

我真的不明白。即使我一直使用double,为什么还需要float

2 个答案:

答案 0 :(得分:4)

三角学方法sincostantoRadians都接受double作为参数并返回double。没有重载接受float并返回float。将float传递给期望double的方法是合法的;它将被隐含地扩大。但是,当您将结果分配给double时,您无法隐式地将float缩小为float

如果需要,您可以将结果明确地转换为float,但使用double可以获得更好的精确度,因此请声明sincos和{{1变量为tan s。

此外,格式说明符double表示整数值,而不是浮点值。使用format specifier f instead of d。您可能还希望在打印时在值之间放置一些间距。

答案 1 :(得分:1)

如果查看API documentation,您会看到trig方法都将返回双精度数。除非你真的需要一个浮动,否则最好的选择是使用双打。您将失去精度,因为您必须将双返回值强制为浮点数。