How do I preserve precision in my sum
output. I think that what is happening is that the precision is exactly the same, but one option chooses to round.
public class Main {
public static void main(String[] args) {
final long seconds = 1637208584L;
final long micro_of_second = 795307;
final long sum = seconds micro_of_second;
System.out.println("seconds micro_of_second: " seconds micro_of_second);
System.out.println("sum: " sum);
System.out.println("equal?: " (sum == seconds micro_of_second));
}
}
Output
seconds micro_of_second: 1637208584795307
sum: 1638003891
equal?: true
CodePudding user response:
The issue here isn't with precision its with the line
System.out.println("seconds micro_of_second: " seconds micro_of_second);
this line implicitly converts seconds
and micro_of_second
to a string and concatenates them together.
so the result you are seeing is actually:
"seconds micro_of_second: " "1637208584" "795307"
what you want to do is evaluate the integer addition before adding it to the string. you can accomplish this by changing that line to
System.out.println("seconds micro_of_second: " (seconds micro_of_second));
CodePudding user response:
In Java, expressions are evaluated left to right. Thus
"seconds micro_of_second: " seconds micro_of_second
Is semantically identical to
("seconds micro_of_second: " seconds) micro_of_second
The expression
"seconds micro_of_second: " seconds
evaluates to a String
, where the (base 10) String
-representation of seconds ("1637208584"
) is appended to the String "seconds micro_of_second: "
. resulting in the String "seconds micro_of_second: 1637208584"
.
Then, the (base 10) String
-representation of micro_of_second
(795307
) is appended to the String "seconds micro_of_second: 1637208584"
, resulting in the String seconds micro_of_second: 1637208584795307
.
By contrast, seconds micro_of_second
adds both values (1637208584 795307
), evaluating to the long
-value 1638003891
.
If we want to first add both long
s, we can enforce the evaluation order by introducing parentheses:
"seconds micro_of_second: " (seconds micro_of_second)
This will evaluate to the String "seconds micro_of_second: 1638003891"
.
Alternatively, if we want to get the total amount of microseconds, we need to multiply the value of seconds
with 1_000_000L
before adding micro_of_second
(since there are 1_000_000
microseconds in a second):
"micros: " (seconds * 1_000_000L micro_of_second)
As an aside: In Java, variable names should be written in camelCase
instead of snake_case
(micro_of_second
-> microOfSecond
)