在学习Prepared语句中发现数据库中的float类型,通过bind_result来获取,会出现精度匹配不正确的情况。
code:
//use prepared to select(bind_result)
//1.select string
$selectstr="select isbn,title,author,price from books";
//2.prepare select
$result3=$con->prepare($selectstr);
//3.bind result
$result3->bind_result($isbn2,$title2,$author2,$price2);
//4.excute the select
$result3->execute();
//5.echo the result use while
while($result3->fetch()){
echo "ISBN:$isbn2 <br />";
echo "Title:$title2 <br />";
echo "Author:$author2 <br />";
echo "Price:$price2 <br /><br />";
}
//it has a problem Price:30.239999771118 should be 30.24,dont know why
初步判断是php自动匹配类型的时候把30.24匹配成了其他未知的类型。
stackoverflow上的回答没有指出原因,但是建议在mysql中双精度float使用decimal!
链接地址:https://stackoverflow.com/questions/5355285/selecting-float-number-from-float-column-with-php-and-mysqli
陈哈哈的笔记中说是这样说的:
这些函数尝试把值转化成正确的类型。比如说,对储存在数据库中,值类型为FLOAT的字段,通过但是作为text类型被select出来。sqlite3_snprintf()将自动转换这个数值。下表详细地说明了转化过程。虽然是C语言,但是我感觉原理都差不多的。
numeric和decimal同义,numeric将自动转成decimal。
对于Decimal(M,N)的取值范围,因为它是以串的形式存放数字,他占用的字节为M+2字节。小数点和负数各占用一个字节,所以他的理论取值范围是这样的。
decimal(2,1) 的取值范围,一共占用4字节,负数和小数点占用2字节,负数最小为-9.9,同理正数符号可以隐藏,最大的正数为99.9.
详细解释:http://blog.csdn.net/caomiao2006/article/details/22655097
·注:更改掉练习的浮点数类型,并更新原来的文章。