Number of decimal digits in a double
A double is not always an exact representation. You can only say how many decimal places you would have if you converted it to a String.
double d= 234.12413;
String text = Double.toString(Math.abs(d));
int integerPlaces = text.indexOf('.');
int decimalPlaces = text.length() - integerPlaces - 1;
This will only work for numbers which are not turned into exponent notation. You might consider 1.0 to have one or no decimal places.
How to get the number of decimal digits from a double in Java? (Ex: 2.34 = 2 , 2.340 = 2 , 0.921 = 3)
This should get the amount after the dec:
Double d = 123.9343;
String[] div = d.toString().split("\\.");
div[0].length(); // Before Decimal Count
div[1].length(); // After Decimal Count
Explanation: You first turn the double into a string and use the split
function to split the string from the .
Once it is in 2 pieces you can then find the length of the string easily with the length
function.
How many decimal Places in A Double (Java)
No.
1.100 and 1.1 are exactly the same value (they are represented exactly the same bit-for-bit in a double
).
Therefore you can't ever get that kind of information from a double
.
The only thing you can do is to get the minimum number of decimal digits necessary for a decimal number to be parsed into the same double
value. And that is as easy as calling Double.toString()
and checking how many decimal digits there are.
How many decimal places does the primitive float and double support?
Those are the total number of "significant figures" if you will, counting from left to right, regardless of where the decimal point is. Beyond those numbers of digits, accuracy is not preserved.
The counts you listed are for the base 10 representation.
Rounding a double value to x number of decimal places in swift
You can use Swift's round
function to accomplish this.
To round a Double
with 3 digits precision, first multiply it by 1000, round it and divide the rounded result by 1000:
let x = 1.23556789
let y = Double(round(1000 * x) / 1000)
print(y) /// 1.236
Unlike any kind of printf(...)
or String(format: ...)
solutions, the result of this operation is still of type Double
.
EDIT:
Regarding the comments that it sometimes does not work, please read this: What Every Programmer Should Know About Floating-Point Arithmetic
Round a double to 2 decimal places
Here's an utility that rounds (instead of truncating) a double to specified number of decimal places.
For example:
round(200.3456, 2); // returns 200.35
Original version; watch out with this
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
long factor = (long) Math.pow(10, places);
value = value * factor;
long tmp = Math.round(value);
return (double) tmp / factor;
}
This breaks down badly in corner cases with either a very high number of decimal places (e.g. round(1000.0d, 17)
) or large integer part (e.g. round(90080070060.1d, 9)
). Thanks to Sloin for pointing this out.
I've been using the above to round "not-too-big" doubles to 2 or 3 decimal places happily for years (for example to clean up time in seconds for logging purposes: 27.987654321987 -> 27.99). But I guess it's best to avoid it, since more reliable ways are readily available, with cleaner code too.
So, use this instead
(Adapted from this answer by Louis Wasserman and this one by Sean Owen.)
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = BigDecimal.valueOf(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
Note that HALF_UP
is the rounding mode "commonly taught at school". Peruse the RoundingMode documentation, if you suspect you need something else such as Bankers’ Rounding.
Of course, if you prefer, you can inline the above into a one-liner:new BigDecimal(value).setScale(places, RoundingMode.HALF_UP).doubleValue()
And in every case
Always remember that floating point representations using float
and double
are inexact.
For example, consider these expressions:
999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001
For exactness, you want to use BigDecimal. And while at it, use the constructor that takes a String, never the one taking double. For instance, try executing this:
System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));
Some excellent further reading on the topic:
- Item 48: "Avoid
float
anddouble
if exact answers are required" in Effective Java (2nd ed) by Joshua Bloch - What Every Programmer Should Know About Floating-Point Arithmetic
If you wanted String formatting instead of (or in addition to) strictly rounding numbers, see the other answers.
Specifically, note that round(200, 0)
returns 200.0
. If you want to output "200.00", you should first round and then format the result for output (which is perfectly explained in Jesper's answer).
Related Topics
Why Does Java Code with an Inner Class Generates a Third Someclass$1.Class File
What Does Maven Update Project Do in Eclipse
How to Find the Index of an Element in an Int Array
Why Are Variables Declared with Their Interface Name in Java
How to Calculate the Elapsed Time of an Event in Java
Spring Boot Actuator Application Won't Start on Ubuntu Vps
Exception 0Xc0000005 from Jni_Createjavavm (Jvm.Dll)
Create Bar Chart in Excel with Apache Poi
Printf %F with Only 2 Numbers After the Decimal Point
Why Are Wait() and Notify() Declared in Java's Object Class
Null Pointer Exception While Using Java Compiler API
Strange Behavior of Class.Getresource() and Classloader.Getresource() in Executable Jar
How to Include Test Classes into Maven Jar and Execute Them