在数据库Mysql中使用浮点数不要用float应当使用decimal

来源:互联网 发布:淘宝网购男士夹克 编辑:程序博客网 时间:2024/06/06 12:29

在学习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 whilewhile($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


·注:更改掉练习的浮点数类型,并更新原来的文章。

阅读全文
0 0