<?php
$string = floatVal(3300);
$float = 3000 * 1.1;
if($string === $float) {
    echo 'String '.$string.' 은 Float '.$float.' 와 같다';
} else {
    echo 'String '.$string.' 은 Float '.$float.' 와 다르다';
}
echo '<br />';
var_dump($string);
echo '<br />';
var_dump($float);
exit();
?>
////////////////결과값////////////////////
String 3300 은 Float 3300 와 다르다
float(3300)
float(3300)
///////////////////////////////////////////

<?php
$string = floatVal(5500);
$float = 5000 * 1.1;
if($string === $float) {
    echo 'String '.$string.' 은 Float '.$float.' 와 같다';
} else {
    echo 'String '.$string.' 은 Float '.$float.' 와 다르다';
}
echo '<br />';
var_dump($string);
echo '<br />';
var_dump($float);
exit();
?>
////////////////결과값////////////////////
String 5500 은 Float 5500 와 같다
float(5500)
float(5500)
///////////////////////////////////////////


위와같이 1.1에 3000을 곱하면 결과값은 같지만 비교연산을 해보면 다르다고 값이 나온다.
여러가지 방법으로 알아보니 이진연산을 하는 컴퓨터 프로그래밍이라서 그런것이라고 한다.
십진수의 소수점 아래 수는 완벽하게 이진수로 변경되지 않는다.
1.1을 이진수로 변환하면 1.000100010001... 이처럼 0001 이 반복된다.
그래서 곱하기를 하면 보이지는 않지만 미묘하게 다른 값이 나오는것이다.
근데 왜 3000을 곱하면 다르고 5000은 같을까? 제길...

꼼수로 해결을 하자면 소수점 자리만큼 10의 제곱을 곱한 후 계산하고 다시 곱한 수로 나누는 방법이 있다.
by 뭔일이여 2009. 5. 12. 17:28