Ik heb afgelopen weekend de JAVA taal eens proberen op te pakken. Ik ben begonnen met iets simpels dat ik steeds verder probeer uit te bouwen.
Ik ben begonnen met een eenvoudige gallon naar liter converter. 1 gallon is 3,7854 liter. Op zich niet zo spannend, maar als ik een lijst maak, dan blijken er waardes tussen te zitten die niet kloppen.
Gebruikte software:
- IntelliJ Idea 8 (trail) op OSX 10.5.6
- java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)
Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)
Probleem doet zich voor op een Intel Based MacBook en een Intel Based iMac (zelfde OS en Java versie).
Bij gebruik van het volgende commando java GalToLit 1 10
krijg ik de volgende output
De uitkomsten 3 en 6 wijken duidelijk af van de rest. Iets wat in mijn ogen niet zou moeten kunnen.
Er wordt een string to integer conversie uitgevoerd in de code, maar dat zou niet mogen omdat een integer geen decimalen kent. Overigens heb ik dezelfde afwijkingen wanneer ik het op de commandline compileer en uitvoer.
Wat (kort) speurwerk op het Internet hielp mij aan de term 'possible loss of precision', maar dat zou alleen voor moeten komen bij rekenkundige functies waar de uitkomst afgerond MOET worden in verband met floating point beperkingen (bijv. 1 / 3 = 0.33333333333etc). In dit/mijn geval zijn het 2 harde constanten die niet hard zijn 'afgebakend' en rekenkundig zouden het aantal cijfers achter de komma maximaal de optelling van de afzonderlijke aantal cijfers achter de komma mogen zijn (1.[2 cijfers achter de komma] * 4.[3 cijfers achter de komma] = 4.[5 cijfers achter de komma]). Trailing zero's even buiten beschouwing gelaten.
Is hier iets tegen te doen? (behalve een andere taal op te pakken dan
)
Ik ben begonnen met een eenvoudige gallon naar liter converter. 1 gallon is 3,7854 liter. Op zich niet zo spannend, maar als ik een lijst maak, dan blijken er waardes tussen te zitten die niet kloppen.
Gebruikte software:
- IntelliJ Idea 8 (trail) op OSX 10.5.6
- java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)
Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)
Probleem doet zich voor op een Intel Based MacBook en een Intel Based iMac (zelfde OS en Java versie).
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| class GalToLit { public static void main(String args[]) { if (args.length == 2) { double liters = 0; // holds the number of gallons int c, counter = 0, gallons = 0; try { gallons = Integer.parseInt(args[0]); counter = Integer.parseInt(args[1]); } catch(NumberFormatException e) { System.out.println("Invalid parameter format"); } for (c = 1; c <= counter; c++) { liters = c * gallons * 3.7854; // convert to liters System.out.println(c * gallons + " gallons is " + liters + " liters."); } } else { System.out.println("Amount in liters required or you forgot the counter."); } } } |
Bij gebruik van het volgende commando java GalToLit 1 10
krijg ik de volgende output
code:
1
2
3
4
5
6
7
8
9
10
| 1 gallons is 3.7854 liters. 2 gallons is 7.5708 liters. 3 gallons is 11.356200000000001 liters. 4 gallons is 15.1416 liters. 5 gallons is 18.927 liters. 6 gallons is 22.712400000000002 liters. 7 gallons is 26.4978 liters. 8 gallons is 30.2832 liters. 9 gallons is 34.0686 liters. 10 gallons is 37.854 liters. |
De uitkomsten 3 en 6 wijken duidelijk af van de rest. Iets wat in mijn ogen niet zou moeten kunnen.
Er wordt een string to integer conversie uitgevoerd in de code, maar dat zou niet mogen omdat een integer geen decimalen kent. Overigens heb ik dezelfde afwijkingen wanneer ik het op de commandline compileer en uitvoer.
Wat (kort) speurwerk op het Internet hielp mij aan de term 'possible loss of precision', maar dat zou alleen voor moeten komen bij rekenkundige functies waar de uitkomst afgerond MOET worden in verband met floating point beperkingen (bijv. 1 / 3 = 0.33333333333etc). In dit/mijn geval zijn het 2 harde constanten die niet hard zijn 'afgebakend' en rekenkundig zouden het aantal cijfers achter de komma maximaal de optelling van de afzonderlijke aantal cijfers achter de komma mogen zijn (1.[2 cijfers achter de komma] * 4.[3 cijfers achter de komma] = 4.[5 cijfers achter de komma]). Trailing zero's even buiten beschouwing gelaten.
Is hier iets tegen te doen? (behalve een andere taal op te pakken dan
leica - zeiss - fuji - apple | PSN = Sh4m1n0