2013-09-03 3 views
-4

Double.valueOf (String s) 함수를 사용하여 문자열을 double로 변환하려고 시도하고 100을 곱합니다. 숫자를 제외하고. 예를 들어 금액이 10.20이고 Double.valueOf (10.20) * 100을 사용하면 결과는 1020.0 대신 1019.9999가됩니다. 이것은 10.20, 8.20, 9.20에 대해서만 발생합니다. 7.20, 1.20, 11.20 등에서 잘 작동합니다. 이유는 무엇입니까? 다음은 내 코드double.valueOf (String) * 100을 곱하면 일부 숫자에 대해 잘못된 결과가 발생합니다.

1 시나리오

문자열의 = "10.20"의 조각이다; * System.out.println ("double 조작 후의 값은"+ (Double.valueOf (firstHalf) 100))입니다.

결과 : - 실제 결과는 1020.0해야으로 이중 manipualtion is1019.9999999999999

후 값. 내가 다음을주는 경우에, 그것을 잘

2 시나리오를 작동

* 문자열의 = "7.20"; System.out.println ("double 조작 후의 값은"+ (Double.valueOf (firstHalf) 100));

결과 : - 어떤 도움이

+0

그것은하지 "나쁜"의를. 숫자를 적절하게 형식을 지정하면 (예 : 0의 소수 정밀도로 제한됨) 다시 '확인'해야합니다. 어쨌든 [모든 컴퓨터 과학자가 부동 소수점에 대해 알아야 할 내용] (https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf)을 참조하십시오. – user2246674

답변

0

사용 BigDecimal

BigDecimal newValue = BigDecimal.valueOf(10.20) 
    .setScale(2, RoundingMode.HALF_UP) 
    .multiply(BigDecimal.valueOf(100)); 
0

자바 이진 부동 포인트를 사용하기 때문에 당신은 나쁜 결과를 얻을를 감상 할 수있다

더블 manipualtion의 is720.0 후 값 부동 소수점 수를 나타내는 표준. 모든 십진수가 이진 소수로 표현 될 수있는 것은 아닙니다. 당신은 java.math.BigDecimal
이미 여기에서 설명 사용해야합니다, Floating point arithmetic not producing exact results

는 부동 소수점 숫자 BigDecimal(String) 생성자를 사용해야합니다 BigDecimal(double) 생성자 피하기 :
new BigDecimal("10.20").multiply(new BigDecimal(100)).toString()

관련 문제