2016-06-24 5 views
0

Я хочу, чтобы преобразовать строку «0.955000» на «0,96» с помощью Java DecimalFormatJava BigDecimal Выпуск

Вот мой фрагмент кода:

String inputVal = "0.955000"; 
DecimalFormat decFmt = new DecimalFormat("0.00") 
decFmt.setRoundingMode(RoundingMode.HALF_UP); 
String outputVal = decFmt.format(Double.valueof(inputVal)); 

Здесь я получаю выходное значение как «0,95». Я ожидал, что выход будет «0.96». Кто-нибудь знает, что не так в моем коде? И есть ли способ, я могу получить «0.96», используя десятичный формат.

+8

Ваше название говорит о проблеме с 'BigDecimal', но ваш код не использует его. С чем вам нужна помощь? – Tunaki

+1

Чтобы ответить на ответ @Tunaki, если вы использовали BigDecimal, вы можете использовать метод '.setScale (..)' и выполнить то, что хотите. – lucasvw

+1

Ahem, 'double' точность. –

ответ

2

Это код, который я попробовал:

import java.math.RoundingMode; 
import java.text.DecimalFormat; 


public class Test 
{ 
    public static void main(String[] args) 
    { 
    String inputVal  = "0.955000"; 
    DecimalFormat decFmt = new DecimalFormat("0.00"); 
    decFmt.setRoundingMode(RoundingMode.HALF_UP); 
    String outputVal = decFmt.format(Double.valueOf(inputVal)); 
    System.out.println(outputVal); 
    } 
} 

Выход я получил с помощью JDK 7 является 0,96, но с JDK 8 я получил 0,95.

Вот почему: 0,955 в качестве двойника: 0,9549999833106995 в IEEE двоичном формате

круглый половина вверх будет: 0,95, который является правильным ответом.

+1

Я получаю 0,95, когда запускаю ваш код с использованием 1,8 .0_40 – azurefrog

+0

Это похоже на следующий вопрос: http://stackoverflow.com/questions/30778927/roundingmode-half-down-issue-in-java8 – Wael

+0

Спасибо за ваш ответ. Возник вопрос. –

0

Обнаружил проблему. Раньше я пытался использовать Java 7 и получал 0,96. Теперь, перейдя на Java 8, я получил его как 0,95. Я думаю, что это проблема с версией Java. Java 7 и 8 ведут себя по-разному для десятичного формата.

+0

Правильный вывод равен 0,95, а не 0,96, так как двойной хранится в двоичном формате IEEE. См. Мое обновление выше – Wael