小数点后的附加数字

时间:2016-11-23 12:14:18

标签: php sql sql-server floating-point

选择查询,在小数点后给出附加数字。 该列的数据类型为十进制(4,2)。 存储的值是1.39,但我得到的是1.3899999999999999。

我可以在php中执行round,number_format但是有没有办法在小数点后得到没有额外数字的确切值?

数据库是MSSQL。

3 个答案:

答案 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端以某种方式将其转换为