KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I am working with an application that is based entirely on doubles, and am having trouble in one utility method that parses a string into a double. I've found a fix where using BigDecimal for the conversion solves the issue, but raises another problem when I go to convert the BigDecimal back to a double: I'm losing several places of precision. For example: import java.math.BigDecimal; import java.text.DecimalFormat; public class test { public static void main(String [] args){ String num = "299792.457999999984"; BigDecimal val = new BigDecimal(num); System.out.println("big decimal: " + val.toString()); DecimalFormat nf = new DecimalFormat("#.0000000000"); System.out.println("double: "+val.doubleValue()); System.out.println("double formatted: "+nf.format(val.doubleValue())); } } This produces the following output: $ java test big decimal: 299792.457999999984 double: 299792.458 double formatted: 299792.4580000000 The formatted double demonstrates that it's lost the precision after the third place (the application requires those lower places of precision). How can I get BigDecimal to preserve those additional places of precision? Thanks! Update after catching up on this post. Several people mention this is exceeding the precision of the double data type. Unless I'm reading this reference incorrectly: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 then the double primitive has a maximum exponential value of E max = 2 K-1 -1, and the standard implementation has K=11. So, the max exponent should be 511, no?
Tags (comma-separated)
Save Edits
Cancel