2015-01-08 4 views
5

Вот моя функция округления числа Шифрования до двух знаков после запятой, но когда округляются число 1.50, кажется, игнорировать концевую ноль и просто возвращает 1,5округляют двойной, сохраняя при этом концевой нулевой

public static double roundOff(double number) { 
     double accuracy = 20; 
     number = number * accuracy; 
     number = Math.ceil(number); 
     number = number/accuracy; 
     return number; 
    } 

Так если я отправлю 1.499, он вернется 1.5, где я хочу 1.50

+2

Существует не отдельный «двойной» для 1,5 и 1,50. Они численно одинаковы, поэтому есть только одно «двойное» представление их обоих. –

+0

Возможно, ваш метод должен возвращать 'String', а не' double', чтобы вы могли делать с ним какое-то форматирование. –

+0

Вы уверены в том, что '20'? Возможно, я неправильно понял, что вы пытаетесь сделать, но ваш метод для '1.489' не вернет' 1.49'. Я думаю, вы бы хотели установить точность до 100 для двух знаков после запятой. – cyon

ответ

10

Это печатный poblem:

double d = 1.5; 
System.out.println(String.format("%.2f", d)); // 1.50 
+0

Получил это. Благодарю. Это помогло. –

2

Чтобы сделать это, вам нужно отформатировать его как String. Java, как и большинство языков, отбрасывает конечный ноль.

String.format("%.2f", number); 

Таким образом, вы можете вернуть String (изменить свой тип возвращаемого из двойной) или просто отформатировать его, когда вам нужно, чтобы отобразить его с помощью кода выше. Вы можете read the JavaDoc for Formatter для того, чтобы понять все возможности с количеством знаков после запятой, размещения запятой и т.д.

+0

Спасибо, решение Джин, которое так же, как твоя работала плавно. –

+0

Только одно примечание, хотя оно не влияет на вывод: '1' в вашей строке формата имеет мало эффекта здесь, так как он устанавливает минимальную ширину поля для всего. Поскольку вы также указываете, что он имеет форму '.99', это уже должно быть больше. – paxdiablo

+0

Спасибо @paxdiablo. Я имел это как нечто другое (отформатированное с разделителем запятой, которое я использую лично), а затем изменил его, чтобы быть более простым и в моей спешке оставил «1.», в. Исправлено сейчас, спасибо! – Todd

3

1.5 есть, количество значащих цифр несмотря на это, такой же как 1.50 (и даже 1.5000000000000).

Вам необходимо отделить значение от его .

Если вы хотите выход с двух десятичных цифр, просто используйте String.format, например, с:

public class Test 
{ 
    public static void main(String[] args) { 
     double d = 1.50000; 
     System.out.println(d); 
     System.out.println(String.format("%.2f", d)); 
    } 
} 

, который выводит:

1.5 
1.50 

Если вы все еще хотите функцию, которая делает все, что для вас и дает вам конкретный формат, вам нужно вернуть строку с чем-то вроде:

public static String roundOff(double num, double acc, String fmt) { 
    num *= acc; 
    num = Math.ceil(num); 
    num /= acc; 
    return String.format(fmt, num); 
} 

и назвать его:

resultString = roundOff(value, 20, "%.2f"); // or 100, see below. 

Это позволит адаптировать точность и формат вывода в любом случае вы желаете, хотя вы можете все еще трудно кода значения, если вы хотите простоты:

public static String roundOff(double num) { 
    double acc = 20; 
    String fmt = "%.2f"; 
    num *= acc; 
    num = Math.ceil(num); 
    num /= acc; 
    return String.format(fmt, num); 
} 

одно замечание: ваш вопрос гласит, что вы хотите, чтобы округлить до «двух знаков после запятой», но это не совсем гель с использованием 20 как точность, так что будет круглый это до следующего кратного 1/20. Если вы действительно хотите округлить до двух десятичных знаков, значение, которое вы должны использовать для accuracy, равно 100.

+0

Спасибо, за подробное объяснение. –

+0

В вашем последнем маленьком фрагменте у вас есть две разные переменные: 'acc' (один параметр, один локальный) и две разные переменные, называемые' fmt'. Затем вы используете переменную, называемую «точность», которая, как представляется, не существует. Вы можете исправить это. –

+0

@David, _damn_ те ошибки cut'n'paste :-) Спасибо за это, исправлено сейчас. – paxdiablo

0

Вы можете попробовать это, если вы хотите выход Строки

double number = roundOff(1.499);//1.5 

DecimalFormat decimalFormat = new DecimalFormat("#.00"); 
String fromattedDouble = decimalFormat.format(number);//1.50 

Функция округления такого же, как вы упомянули в своем вопросе.

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