Php 在MySQL中选择浮点
我正在尝试根据标识符和价格在表上进行Php 在MySQL中选择浮点,php,mysql,floating-point,database,Php,Mysql,Floating Point,Database,我正在尝试根据标识符和价格在表上进行SELECT匹配,例如: SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31'; 以上返回零行,而如果删除price='101.31'位,则返回正确的行 做一个 SELECT * FROM `table`; 返回与上面相同的行,并非常清楚地说明price='101.31'。但是select无法匹配它。将=更改为可能与以下内容有关: SELECT * FROM table WHE
SELECT
匹配,例如:
SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';
以上返回零行,而如果删除price='101.31'
位,则返回正确的行
做一个
SELECT * FROM `table`;
返回与上面相同的行,并非常清楚地说明
price='101.31'
。但是select无法匹配它。将=
更改为可能与以下内容有关:
SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01;
从表中选择*,其中ident='ident23'和ABS(价格-101.31)<.01;
它不起作用,因为浮点数本质上是不精确的。实际值可能类似于“101.3100000000001”,您可以先对其使用ROUND()将其四舍五入到2位,或者更好地使用十进制类型而不是浮点数。转换为十进制对我来说很有效:
SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);
但是,您可能想首先考虑把<代码>价格<代码>列为十进制。十进制通常被认为是处理货币价值时使用的最佳类型。
千万不要使用浮动货币。这有用吗
SELECT * , ROUND( price, 2 ) rounded
FROM table
WHERE ident = 'ident23'
HAVING rounded = 101.31
今天,我也遇到了同样的情况,只需使用MySQL的FORMAT函数就可以解决,它将返回与WHERE子句完全匹配的结果
SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2)
说明:FORMAT('col name',浮点数的精度)
我一直在寻找解决方案,但最后我还是用之前的php number\u FORMAT()完成了,这是在@hmasif的解决方案中找到的
使用此选项,您将获得float-mysql匹配:
$floatmatch = number_format((float)$yourfloatvariable,5);
其中5是从小数点算起的五个字符串。e、 g.7.93643试试这个:从价格像101.31一样的表格中选择* 我从哪里为客户找零钱?(对不起,这里有点店主的幽默:)这将查找表中任何值为“101”的内容。您需要将其更改为“WHERE CAST(价格为十进制(7,2))=CAST(101.31为十进制(7,2));