java - Strange error when decreasing double value -


this question has answer here:

while developing application i've found serious error. first details: i've wanted display temperature on gui. temperature double value. user should able increase/decrease temperature. goal emulate heating/temperature valve heating unit. in addition have random values, user should able increase/decrease value using gui. value intialized on startup 20.1 (just random value setted @ beginning).

i've noticed strange behaviour when tried decrease temperature. works finde when incrementing. decreasing temperature (by stepsize 1) leads following: 20.1 , 19.1 , 18.1, 17.1, 16.1, , 15.100000000000001, 14.100000000000001 etc.

what's reason? error occur, when using values ending on .1. make no difference when trying base value of 22.1 or 31.1.

the error occurs change 16.1 15...

it's reproducable everytime. i've wrote test application, feel free try it:

package devices;  import java.awt.eventqueue; import java.awt.font; import java.awt.event.actionevent; import java.awt.event.actionlistener;  import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel;  public class test extends jframe {  /**  * temperature  */ private double temp = 20.1; private jpanel contentpane;  /**  * launch application.  */ public static void main(string[] args) {     eventqueue.invokelater(new runnable() {         @override         public void run() {             try {                 test frame = new test();                 frame.setvisible(true);             } catch (exception e) {                 e.printstacktrace();             }         }     }); }  /**  * create frame.  */ public test() {     setdefaultcloseoperation(jframe.exit_on_close);     setbounds(100, 100, 271, 152);     contentpane = new jpanel();     setcontentpane(contentpane);     contentpane.setlayout(null);      final jlabel lblnewlabel = new jlabel("");     lblnewlabel.setbounds(10, 11, 235, 56);     lblnewlabel.setfont(new font("tahoma", font.plain, 19));     lblnewlabel.settext(string.valueof(temp));     contentpane.add(lblnewlabel);      jbutton btnnewbutton_1 = new jbutton("increase");     btnnewbutton_1.addactionlistener(new actionlistener() {         @override         public void actionperformed(actionevent e) {             temp = temp + 1;             lblnewlabel.settext(string.valueof(temp));         }     });     btnnewbutton_1.setbounds(10, 78, 101, 23);     contentpane.add(btnnewbutton_1);      jbutton btnnewbutton = new jbutton("decrease");     btnnewbutton.setbounds(137, 78, 108, 23);     btnnewbutton.addactionlistener(new actionlistener() {         @override         public void actionperformed(actionevent e) {             temp = temp - 1;             lblnewlabel.settext(string.valueof(temp));         }     });     contentpane.add(btnnewbutton); }  } 

greetings , in advance,

julian

0.1 isn't round number in binary, can't step evenly tenths. example here. if tenths finest resolution need, store them int , display them manually:

(temp/10).tostring() +"."+(temp℅10).tostring() 

this turbo pascal did amounts of money, example.


Comments