double is made of 1 bit sign 52 bit mantissa and 11 bit exponent and long is made of 1 bit sign and 63 bit number. So double can have larger values, and they both take 64 bits in your memory. So double has the precision of at most 16 digits and long of at most 19 digits. (Also, a double can have a value of Infinity) If you're looking for an object that can store very large numbers, use BigInteger or BigDecimal, their value is only limited by how much memory your computer has and they can do precise math. Answer from Chemical-Asparagus58 on reddit.com
🌐
Reddit
reddit.com › r/learnjava › why does adding long to double as the result we got double?
r/learnjava on Reddit: Why does adding long to double as the result we got double?
August 8, 2022 -

let’s say we have: long l1 = 9L; double d1 = 3.5;

double result = l1 + d1;

Just learned that arithmetic operations are done only on: int, long,double, float.

And I know about promoting data type to higher by occupation in memory. But both long and double occupies 8 bytes. So why the result is double?

Top answer
1 of 4
11
double is the wider data type. A long only contains the direct binary representation of the stored number while a double uses IEEE-754 floating point format and by doing so it has a much wider range. Further: converting to long would be a lossy conversion as the decimals would get lost. Generally, non-lossy conversions to wider data types are preferred.
2 of 4
3
The long value is converted to a double before the addition occurs, and double addition results in a double. All long values 'fit' in the range of a double, not all double values fit in the range of long. If the conversion-precedence worked the other way then you would be automatically discarding precision over ranges of values that are far more typical to encounter than the small degree of precision you lose going from long to double on value ranges that are atypically used. eg. long before = 9223372036854775797L; double d = before; long after = (long) d; // 9223372036854775807L; The difference between before and after is 2 decimal digits of precision error. double before = 0.123456789D; long l = (long) before; double after = l; The difference between before and after is 9 decimal digits of precision. So the 'why' in your question... Because this is the more useful of the two choices converting between two equal 'sized' types. Now why they decided to silently allow precision loss, that's tougher - I expect there's a fair number of developers that wish this was not the case (and languages like Rust are far more strict in this regard).
🌐
RETIT
retit.de › performance-in-detail-long-vs-double-in-java-2
Performance in Detail: Long vs. Double in Java – RETIT
April 23, 2018 - But still, even when looking at the boxed types Long and Double, the only attribute in both classes is the wrapped primitive, so Double objects should consume the same amount of memory as Long objects.
Top answer
1 of 3
26

If you are storing integers, use Long. Your statement that "Advantage of Using Double is that it gives a more wider range for storing Whole Numbers" is incorrect. Both are 64 bits long, but double has to use some bits for the exponent, leaving fewer bits to represent the magnitude. You can store larger numbers in a double but you will lose precision.

In other words, for numbers larger than some upper bound you can no longer store adjacent "whole numbers"... given an integer value above this threshold, the "next" possible double will be more than 1 greater than the previous number.

For example

public class Test1  
{

    public static void main(String[] args) throws Exception 
    {
        long   long1 = Long.MAX_VALUE - 100L;
        double dbl1  = long1;
        long   long2 = long1+1;
        double dbl2  = dbl1+1;
        double dbl3  = dbl2+Math.ulp(dbl2);

        System.out.printf("%d %d\n%f %f %f", long1, long2, dbl1, dbl2, dbl3);
    }

}

This outputs:

9223372036854775707 9223372036854775708
9223372036854776000.000000 9223372036854776000.000000 9223372036854778000.000000

Note that

  1. The double representation of Long.MAX_VALUE-100 does NOT equal the original value
  2. Adding 1 to the double representation of Long.MAX_VALUE-100 has no effect
  3. At this magnitude, the difference between one double and the next possible double value is 2000.

Another way of saying this is that long has just under 19 digits precision, while double has only 16 digits precision. Double can store numbers larger than 16 digits, but at the cost of truncation/rounding in the low-order digits.

If you need more than 19 digits precision you must resort to BigInteger, with the expected decrease in performance.

2 of 3
3

This looks like the wrong battle:

From the Java Tutorial

The long data type is a 64-bit signed two's complement integer. It has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (inclusive).

That's pretty close to 19 significant digits

From Wikipedia

This gives from 15 - 17 significant decimal digits precision.

So, despite its apparent "superiority" Double will serve you worse than Long. And I'm merely guessing here, but intuitively I'd say serialization/deserialization of floating point types are costlier operations than the same operations on integral data types, but even if there are differences they will be quite small on modern systems.

So, when working with integers, stick to Long.

🌐
Blogger
javahungry.blogspot.com › 2022 › 11 › long-vs-double.html
Java long vs double | Java Hungry
Java developers tutorials and coding. ... In this post, I will be sharing what is the difference between long and double in Java. Both are primitive data types.
🌐
Reddit
reddit.com › r/java › double vs bigdecimal in financial programming
r/java on Reddit: Double vs BigDecimal in financial programming
July 15, 2016 -

Everyone says that BigDecimal should be used when dealing with money but it’s much slower and takes more memory than double. I would think this would be especially important in high frequency low-latency applications like trading. Do people actually use BigDecimal in such systems or do they use doubles with some kind of workaround to handle the precision issue?

Edit: I do have experience working on trading and risk systems and I see doubles used much more often than BigDecimal so I was curious to see if this is more common in actual practice. Most of the systems I worked on only need precision to the penny so I wonder if that’s the reason?

Also, BigDecimal is a pain to use and code written with it look much uglier than plain doubles.

Find elsewhere
🌐
Coderanch
coderanch.com › t › 328469 › java › comparision-double-long
comparision between double and long (Java in General forum at Coderanch)
Books: Java Threads, 3rd Edition, Jini in a Nutshell, and Java Gems (contributor) ... 123456789.00000001 == 123456789.0" should return true. But I want them as false 123456789.00000001 == 123456789.0000000 should return me false. How do I do that? Rizwan SCJA, SCJP, SCWCD, SCBCD, SCDJWS. ... If you remove string and give numbers as double instead of string it says equal(compare method returns 0) BigDecimal bd1 = new BigDecimal(1234567891.00000001); BigDecimal bd2 = new BigDecimal(1234567891); bd1.compareTo(bd2) returns 0.
🌐
TestMu AI Community
community.testmuai.com › ask a question
How does serialization performance compare between `long` and `double` in Java? - TestMu AI Community
April 1, 2025 - Both long and double take 8 bytes in Java, and while double offers a wider range for storing whole numbers, long might still be sufficient for many use cases. How does java long vs double serialization and deserialization performance compare?
Top answer
1 of 4
7

The absolute quantity of information that you can store in 64 bit is of course the same.

What changes is the meaning you assign to the bits.

In an integer or long variable, the codification used is the same you use for decimal numbers in your normal life, with the exception of the fact that number two complement is used, but this doesn't change that much, since it's only a trick to gain an additional number (while storing just one zero instead that a positive and a negative).

In a float or double variable, bits are split in two kinds: the mantissa and the exponent. This means that every double number is shaped like XXXXYYYYY where it's numerical value is something like XXXX*2^YYYY. Basically you decide to encode them in a different way, what you obtain is that you have the same amount of values but they are distribuited in a different way over the whole set of real numbers.

The fact that the largest/smallest value of a floating number is larger/smaller of the largest/smalles value of a integer number doesn't imply anything on the amount of data effectively stored.

2 of 4
2

A double can store a larger number by having larger intervals between the numbers it can store, essentially. Not every integer in the range of a double is representable by that double.

More specifically, a double has one bit (S) to store sign, 11 bits to store an exponent E, and 52 bits of precision, in what is called the mantissa (M).

For most numbers (There are some special cases), a double stores the number (-1)^S * (1 + (M * 2^{-52})) * 2^{E - 1023}, and as such, when E is large, changing M by one will make a much larger change in the size of the resulting number than one. These large gaps are what give doubles a larger range than longs.

🌐
Pediaa
pediaa.com › home › technology › it › programming › what is the difference between long and double in java
What is the Difference Between long and double in Java - Pediaa.Com
May 30, 2019 - The value of long ends with letter ... is 0. “double” is a data type that stores floating point numbers. It is similar to a float data type. Unlike, a float which stores 32 bit IEEE 745 floating point numbers, double stores 64-but IEEE 754 floating point numbers...
🌐
Quora
quora.com › What-is-the-difference-between-an-int-a-long-a-double-and-a-decimal-in-Java
What is the difference between an int, a long, a double and a decimal in Java? - Quora
Answer (1 of 5): There are eight primitive datatypes supported by Java. Primitive datatypes are predefined by the language and named by a keyword. int * Int data type is a 32-bit signed two's complement integer. * Minimum value is - 2,147,483,648 (-2^31) * Maximum value is 2,147,483,647(incl...
🌐
Domo
community-forums.domo.com › home › community forums › archive
What the difference between double and long data types - Domo Community Forum
August 10, 2016 - I assume they are both floating point numbers?, but would like to know the capacities of each.
🌐
Coderanch
coderanch.com › t › 689430 › java › primitive-long-double-compatibility
primitive long and double compatibility (Beginning Java forum at Coderanch)
Grammar lesson: "long" is an adjective - describing the implied noun (integer) "double" is also an adjective - describing the implied noun float (floating-point number, to be precise) In computer grammar terms, the "adjectives" are called modifiers. So you have 2 different base types and therefore ...
🌐
Blogger
javarevisited.blogspot.com › 2016 › 05 › difference-between-float-and-double-in-java.html
Difference between float and double variable in Java? Example
It takes 8 bytes to store a variable while float just takes 4 bytes. This means if memory is a constraint then it's better to use float than double. By the way, the double type also has a larger range than float and if your numbers don't fit ...