选择查询,在小数点后给出附加数字。 该列的数据类型为十进制(4,2)。 存储的值是1.39,但我得到的是1.3899999999999999。
我可以在php中执行round,number_format但是有没有办法在小数点后得到没有额外数字的确切值?
数据库是MSSQL。
答案 0 :(得分:1)
您的数据库库很可能正在将DECIMAL(4, 2)
数据类型转换为幕后的float
。现在1.39
不能完全表示为浮点数,而是近似为1.3899999999999999023003738329862244427204132080078125
(使用online converter或执行<?php ini_set("precision", 99); var_dump(1.39);
)。
有一些解决方法,最简单的方法是在查询级别将十进制数转换为字符串:
SELECT CAST(col AS VARCHAR(4)) AS col_as_string FROM ...
另一个解决方案是使用似乎对值进行舍入的number_format
函数。
答案 1 :(得分:1)
请注意,PHP没有针对带小数位的数字的精确数据类型。使用这些数字时,它将始终使用近似数据类型(浮点数)。
因此,例如将0.1 + 0.2与0.3进行比较可能很可能导致false
。这意味着:小心平等比较。
显示此类值时,您不应该依赖默认演示文稿,而是使用number_format
。例如。 number_format($value, 2)
。
如果您想完全避免浮点问题,请不要使用带小数位的数字。这可能是一个麻烦(例如,检索1.39的整数139并记住这个值意味着百分之一。)
答案 2 :(得分:0)
我怀疑1.39不能完全表示为浮动。
我不懂PHP,所以这里有一些Java代码来演示:
class DoubleFloat {
public static void main(String[] args) {
float f = 1.39f;
double d = 1.39f;
System.out.println("f = " + f);
System.out.println("d = " + d);
}
}
输出:
f = 1.39
d = 1.3899999856948853
取决于您在PHP端尝试做什么,但您可以将数字存储为整数,例如1.39存储为139并在PHP端以某种方式将其转换为 。