2016-04-08 3 views
0

Я новичок в Java. Я хочу распечатать значения sin, cos и tan за каждые 15-градусный интервал.Java: Возможная потеря точности при использовании `Math.sin()`

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() линии, компилятор печатает

error: possible loss of precision
required: float
found: double

Я действительно не понимаю. Почему он требует double, хотя я все время использую float?

+0

Почему у вас есть грех? Просто используйте double, если у вас нет реальной причины использовать float, например. манипуляции с изображениями или графики. – matt

ответ

2

тригонометрические методы sin, cos, tan и toRadians все принимают double в качестве параметра и возврата double. Нет перегрузок, которые принимают float s и возвращают float s. Законно передавать float методу, ожидающему double; он будет расширяться неявно. Но вы не можете сузить double до float неявно, когда вы назначаете результаты float s.

Вы можете явно привести результаты к float, если вы хотите, но вы получите более высокую точность с double, поэтому объявлять sin, cos и tan переменные double с.

Кроме того, спецификатор формата d означает целочисленные значения, а не значения с плавающей запятой. Используйте format specifier f instead of d. Вы также можете поместить промежутки между вашими значениями при их печати.

+0

Спасибо, это сработало. Я думал, что спецификаторы формата 'f' и' d' имеют какое-то отношение к float и double – flufflepuff

+0

Нет, 'f' означает« фиксированная точка »(как формат),' e' для экспоненциального или инженерного и 'g' выбирает самое подходящее. См. Строки формата printf, которые также были основой для функции printf в Java. – LutzL

0

Если вы посмотрите на API documentation, вы увидите, что тригг-методы будут возвращены в два раза. Если вам действительно не нужна поплавка, лучше всего использовать двойники. Вы теряете точность, потому что вы вынуждаете свои двойные возвращаемые значения в поплавки.

Смежные вопросы