Results 1 to 9 of 9
Thread: Simple double calculations...
- 08-31-2011, 10:54 AM #1
Member
- Join Date
- Aug 2011
- Posts
- 22
- Rep Power
- 0
Simple double calculations...
Hi there, it's me again asking basic Java questions ^^'
At some point in my program I have run into weird results when subtracting a hundredth to a double value.
I created this SSCCE to show what I'm talking about:
Which returns:Java Code:public static void main(String[] args) { double value = 1.02; System.out.println(value+" - 0.01 = "+(value-0.01)); value = 2.02; System.out.println(value+" - 0.01 = "+(value-0.01)); value = 43.09; System.out.println(value+" - 0.01 = "+(value-0.01)); value = 95.07; System.out.println(value+" - 0.01 = "+(value-0.01)); value = 205.05; System.out.println(value+" - 0.01 = "+(value-0.01)); }
Can someone tell me why is this happening and how can be fixed?Java Code:1.02 - 0.01 = 1.01 2.02 - 0.01 = 2.0100000000000002 43.09 - 0.01 = 43.080000000000005 95.07 - 0.01 = 95.05999999999999 205.05 - 0.01 = 205.04000000000002
Thanks in advance once again,
b0rtLast edited by b0rt; 08-31-2011 at 10:58 AM. Reason: Added different decimal values
- 08-31-2011, 11:11 AM #2
Member
- Join Date
- Aug 2011
- Posts
- 22
- Rep Power
- 0
Oh, just found out myself...
Instead of:
I used:Java Code:System.out.println(value+" - 0.01 = "+(value-0.01);
And problem solved...Java Code:System.out.println(value+" - 0.01 = "+((value*100)-1)/100.00);
But still feels awkward having those results...
Does anyone know why Java can't make proper decimal subtractions?Last edited by b0rt; 08-31-2011 at 11:25 AM. Reason: spelling + question
- 08-31-2011, 11:53 AM #3
Moderator
- Join Date
- Apr 2009
- Posts
- 10,448
- Rep Power
- 16
- 08-31-2011, 01:59 PM #4
Member
- Join Date
- Aug 2011
- Posts
- 22
- Rep Power
- 0
Thanks for the link Toll!
I can understand that decimal values are represented in memory in an abstract way and that can cause errors when managing high numbers but... it just fails with a simple subtraction like:
2.02 - 0.01
It feels like a very tacky implementation to me... if you use one pair of integers (int base, int power) to represent a floating point number (value = base * 10 ^ power) it should not be so prone to errors...
I can imagine it is done to save memory consumption but still feels cheese having to do these tricks in order to avoid precision errors.
Hope I don't disturb anyone with my opinion, because it's just that.
Regards!
- 08-31-2011, 02:03 PM #5
Moderator
- Join Date
- Feb 2009
- Location
- New Zealand
- Posts
- 4,545
- Rep Power
- 11
It gets much worse!
Mathematicians imagine (but only imagine!) quantities with infinite precision. Computers deal with finite time and finite resources: there isn't paper enough in all the world to write down the real numbers between 0 and 1 using a finite alphabet. So computers cheat and use well established rules for dealing with quantites using only finite precision. Java follows these rules faithfully and in a cross platform way. (as detailed in the link)
It's worse because the mathematician imagines proper decimal subtraction until the day he imagines no more. Finiteness wins.
-----
The results you are getting are probably quite good enough: just ugly. (BigDecimal offers arbitrary, though still finite, precision if you must.) You deal with ugliness using some version of formatting like DecimalFormat or one of the printf() tribe.
- 08-31-2011, 02:15 PM #6
Moderator
- Join Date
- Feb 2009
- Location
- New Zealand
- Posts
- 4,545
- Rep Power
- 11
And what makes 2.02-0.01 simple? More simple than e^pi, say.
Anyway the important thing is to use formatting to get the output looking exactly the way you want rather than resorting to near enough arithmetical tricks to blugeon the quantities.
- 08-31-2011, 02:18 PM #7
- Join Date
- Sep 2008
- Location
- Voorschoten, the Netherlands
- Posts
- 11,394
- Blog Entries
- 7
- Rep Power
- 17
When people rob a bank they get a penalty; when banks rob people they get a bonus.
- 08-31-2011, 02:42 PM #8
Member
- Join Date
- Jan 2011
- Posts
- 67
- Rep Power
- 0
Please keep in mind that asking a computer to subtract 0.01 from 2.02 is equally as "simple" as asking you to subtract a third from 1, but I'd like to see you try that in base 10 :P.
Computers work in base 2 (binary) while most humans are used to working in base 10 (decimal) and not all decimal numbers can be properly represented using binary. Similarly in base 3 subtracting a third from 1 is easy it's just 1 - 0.1 = 0.2, but it's impossible to represent a third in base 10 which is why I have to keep referring to it as a "third" rather than the numerical representation which in decimal is something like 0.33333333333333333333333333333333333333333333333 ect.Last edited by Skiller; 08-31-2011 at 02:46 PM.
Currently developing Cave Dwellers, a Dwarf Fortress/Minecraft style game for Android.
- 08-31-2011, 03:01 PM #9
Moderator
- Join Date
- Feb 2009
- Location
- New Zealand
- Posts
- 4,545
- Rep Power
- 11
The base 2 business is often mentioned in this context (and it does play a role in the standards of floating point arithmetic conventionally adopted) but the problem is deeper: you can't uniquely name the real numbers over ever so small a continuous range with finite strings drawn from a finite alphabet whatever the convention you use for the numerals.
(I deliberately put it that way to avoid the point Jos mentioned: you could just represent a quantity analogically with a voltage or whatever. I was actually thinking of those characters in Gulliver's Travels who avoided the ambiguities of language by using real objects to communicate.)
Similar Threads
-
Rounding calculations
By lynxbci in forum New To JavaReplies: 9Last Post: 08-20-2011, 03:49 PM -
Thread calculations, and another thread to use the calculations
By phil128 in forum Threads and SynchronizationReplies: 4Last Post: 12-12-2010, 04:32 PM -
Help Please: SWT double buffering simple animation
By darkthawt in forum SWT / JFaceReplies: 1Last Post: 06-24-2010, 11:06 PM -
[SOLVED] Simple Calculations in Java
By fullmetaljacket in forum New To JavaReplies: 9Last Post: 05-19-2009, 03:19 AM -
decimal calculations?
By arnab321 in forum CLDC and MIDPReplies: 5Last Post: 11-19-2008, 03:36 AM


LinkBack URL
About LinkBacks
Reply With Quote

Bookmarks