2015-04-13 3 views
1

редактировал свой вопрос:Java - Лучший способ получить число после десятичного знака

, что является лучшим способом, чтобы извлечь число, которое приходит после знаков после запятой. Я попробовал несколько решений, но это не поможет мне

float n = 67.7345f; 
System.out.println(n % 1); 
System.out.println(n - Math.floor(n)); 
System.out.println(n - (int)n); 

здесь выход:

0.7344971 
0.7344970703125 
0.7344971 

Но я хочу точно 7345

Любой лучший способ получить точное число после десятичной точки?

+0

'\ d + \. (\ d +) 'может помочь вам (после преобразования' float' в 'String'). – Maroun

+2

'% .2f' будет только печатать 2 десятичных знака ....'% .4f' будет работать лучше в вашем случае! – assylias

+2

Вы ограничиваете вывод на 2 цифры после точки (с помощью '% .2f%'). Просто удалите '.2' и вы получите все цифры после точки (или используйте более широкий предел, например '.6' или что-то в этом роде) –

ответ

3

Вот код, который будет печатать все цифры, которые вы укажете:

float n = 67.7345f; 
System.out.printf("n %% 1= %.4f%n", n % 1); 
System.out.printf("n - Math.floor(n) = %.4f%n", n - Math.floor(n)); 
System.out.printf("n - (int)n= %.4f%n", n - (int)n); 

Главное - использовать %.4f.

Посмотрите на sample program output.

2

Но я хочу точно 7345

Таким образом, вы можете просто использовать %.4f.

%.2f будет ограничиваться 2-мя десятичными знаками.

Любой лучший способ получить точное число после десятичной точки?

Когда вы имеете дело с числами с плавающей запятой, есть, конечно, несколько проблем с числами с плавающей запятой. floatis 32-битная точность IEEE 754 с плавающей запятой. Хороший прочитать What Every Computer Scientist Should Know About Floating-Point Arithmetic

Я не знаю, если тот лучший способ или нет, но вот один подход к работе с округлением чисел с плавающей запятой:

public static BigDecimal roundFloat(float x, int roundTodecimalPlace) 
{ 
    BigDecimal b = new BigDecimal(Float.toString(x)); 
    b = b.setScale(roundTodecimalPlace, BigDecimal.ROUND_HALF_UP);  
    return b; 
} 

Тогда называют это как

float n = 67.7345f; 
    BigDecimal i; 
    i=roundFloat(x,4); 
+0

Округление в два раза приводит к смещению округления. – tchrist

0

Вы можете использовать java.math.BigDecimal, чтобы точно хранить данные. Затем можно напечатать точные цифры после десятичной точки.

С поплавком невозможно напечатать точный номер, потому что вы не знаете, сколько цифр имело начальное число.

Так что будьте уверены, проверьте ответ с:

float n = 67.7f; 
float n = 67.73f; 
float n = 67.734f; 
float n = 67.7345f; 

String floatString = Float.toString(n) // could work, if no calculation was made with the float variable. 

BigDecimal number = new BigDecimal("67.734"); 
BigDecimal result = number.subtract(new BigDecimal(number.longValue())); 
System.out.println(result); // 0.734 
+0

Что вы собираетесь делать, когда 'printf' является, очевидно, правильным ответом здесь? – tchrist

+0

Если разработчик знает о длине поплавка, то printf работает хорошо. Это была моя ошибка, считая, что printf не будет округлить правильно. Я не вижу требования заполнить цифровые места нулями. – test

0

Если вы используете numWithDecimals% 100 будет удалить первые 2 значения, и вы будете просто иметь десятичные :)

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