【发布时间】:2014-03-06 04:28:06
【问题描述】:
我有一些像这样的规格数据(LSL/USL),
数据类型为实数,
如果我用 MSSQL Server Management Studio(简称 MSSMS)查询,
它显示为 0.45,
但如果我通过 php4.4 的 sqlsrv 驱动程序使用 php 查询,
我得到了 0.44999998807907,但我需要在 MSSMS 中得到完全相同的值,
这不仅仅是四舍五入的问题,
ex:
php => 0.00030000001424924, MSSMS => 0.0003
php => 0.0049999998882413, MSSMS => 0.005
php => 0.0049000000581145, MSSMS => 0.0049
还有!!!!上面的例子是同一列,所以不能通过简单地应用于 ROUND() 来修复。
我知道 real 是近似数字, 所以得到这个是合理的, 但我需要一个解决方法, 当我们使用asp或vb时,我们没有这个问题, 可能是数据驱动程序的一些隐式转换, 无论如何,欢迎任何建议或评论。 **首先,我想对所有花时间帮助我的人说声“谢谢”。** 但这个问题实际上可能更棘手, 对不起,我没有展示足够的例子来指导你正确的方式,DECLARE @TABLE TABLE(VALUE REAL)
INSERT INTO @TABLE VALUES
(0.00030000001424924),(0.0049999998882413),(0.0049000000581145),
(0.000099999997473788),(0.60000002384186),(0.000039999998989515),
(0.00025000001187436)
SELECT CAST(VALUE AS DECIMAL(10,4)) AS [Decimal Values]
,ROUND(VALUE, 4) AS [Rounded values]
,CAST(VALUE AS NUMERIC(10,4)) AS [Numeric Values]
FROM @TABLE
在上述情况下,
0.00025000001187436 在 MSSMS 中应该是 0.00025,但我们会得到 0.0003
0.000039999998989515 应该是 4E-05。
我们如何在 PHP 查询中模拟并获得相同的结果?
那可能吗?
而且,如果我决定将数据类型从实数更改为十进制,
小数的正确精度是多少?十进制(?,?)
不丢失精度。
【问题讨论】:
-
您是否一开始就故意使用 REAL?
0.005可以像0.0050一样“可读”吗?如果是这样,那么只需使用比例为 4 的DECIMAL,例如CONVERT(DECIMAL(9,4), col)。如果您希望显示的小数位数取决于第一个 0 在更重要的数字之后的位置,请在表示层中对其所属的位置执行此格式化。
标签: php sql-server floating-point sqldatatypes