What is the return type of the round() method in the snippet?
If this is the Math.round() method, it returns a Long when the input param is Double.
So, you will have to cast the return value:
int a = (int) Math.round(doubleVar);
Answer from Mihir Mathuria on Stack OverflowWhat is the return type of the round() method in the snippet?
If this is the Math.round() method, it returns a Long when the input param is Double.
So, you will have to cast the return value:
int a = (int) Math.round(doubleVar);
If you don't like Math.round() you can use this simple approach as well:
int a = (int) (doubleVar + 0.5);
If you explicitly cast double to int, the decimal part will be truncated. For example:
int x = (int) 4.97542; //gives 4 only
int x = (int) 4.23544; //gives 4 only
Moreover, you may also use Math.floor() method to round values in case you want double value in return.
If the double is a Double with capital D (a boxed primitive value):
Double d = 4.97542;
int i = (int) d.doubleValue();
// or directly:
int i2 = d.intValue();
If the double is already a primitive double, then you simply cast it:
double d = 4.97542;
int i = (int) d;
is there a possibility that casting a double created via
Math.round()will still result in a truncated down number
No, round() will always round your double to the correct value, and then, it will be cast to an long which will truncate any decimal places. But after rounding, there will not be any fractional parts remaining.
Here are the docs from Math.round(double):
Returns the closest long to the argument. The result is rounded to an integer by adding 1/2, taking the floor of the result, and casting the result to type long. In other words, the result is equal to the value of the expression:
(long)Math.floor(a + 0.5d)
For the datatype Double to int, you can use the following:
Double double = 5.00;
int integer = double.intValue();
This truncates (floors), and does not round. Use at your own risk.
For your example, it seems that you want to use Math.rint(). It will return the closest integer value given a double.
int valueX = (int) Math.rint(x);
int valueY = (int) Math.rint(y);
public static void main(String[] args) {
double x = 6.001;
double y = 5.999;
System.out.println(Math.round(x)); //outputs 6
System.out.println(Math.round(y)); //outputs 6
}
The problem is that by the time you pass a value to round() the "horse is already out of the barn: integer division chops off the fractional part, so Math.round() gets a clean 1, which it happily returns.
Casting x or y to double before the call will let you achieve the expected result:
int z = Math.round(((double)x)/y);
It doesn't give 2, because you are doing integer arithmetic and so (5/3) will be 1 in integer arithmetic.
So my advice is to cast any one of operands.
Ex.
Math.round((double)x/y)