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

在学习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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值