0.1+0.1+0.1.....
0.1を100足した結果は、10ではない。
これは、10進数で、1/3が0.333333.....と循環少数になる減少と同じで、
0.1を2進数で表現すると、循環小数となり、2進数で、0.1を表現することは、
できないのが理由だ?
このような誤差が問題となる場合、0.1を整数に変換後、処理し、
その後、少数に戻すという処理を行う必要があったり、、
/**
* Copyright alotfuck ( http://wonderfl.net/user/alotfuck )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/vdLV
*/
package {
import flash.display.Sprite;
/**
* 0.1を100足した結果は、10ではない。
* これは、10進数で、1/3が0.333333.....と循環少数になる減少と同じで、
* 0.1を2進数で表現すると、循環小数となり、2進数で、0.1を表現することは、
* できないのが理由だ?
*
* このような誤差が問題となる場合、0.1を整数に変換後、処理し、
* その後、少数に戻すという処理を行う必要があったり、、
*/
public class FlashTest extends Sprite {
public function FlashTest() {
// write as3 code here..
var value:Number=0.1;
var count:Number=0;
while(++count<100){
value+=0.1;
}
new Text(10,10,"count > "+ count+" value > "+value , this);
value=1/3;
count=0;
while(++count<100){
value+=1/3;
}
new Text(10,30,"count > "+ count+" value > "+value , this);
new Text(10,50,"---------------------------" , this);
value=0.1;
value*=10;
count=0;
while(++count<100){
value+=0.1*10;
}
value/=10;
new Text(10,70,"count > "+ count+" value > "+value , this);
}
}
}
import flash.text.*;
import flash.display.*;
class Text extends Sprite{
public function Text(x:Number,y:Number,value:String,parent:Sprite){
var txt:TextField=new TextField();
txt.text=value;
txt.x=x;
txt.y=y;
txt.width=500;
parent.addChild(txt);
}
}