2

我浪费了一些时间来寻找与 mysql 结合使用的学说中的错误,其中双2.5精度不断存储为2.0. 我发现使用德语本地de_DE使用小数分隔符,而不是.导致学说创建 sql 查询,如

insert into table (doubleColumn) values('2,5') -- will result in a 2.0

使用 php 中的这些行可以重现导致此问题的问题

$a=2.5;
printf("%s",$a); // prints out 2.5
echo $a; // prints out 2.5
setlocale(LC_ALL,"de_DE");
printf("%s",$a); // prints out 2,5
echo $a; // prints out 2,5
echo "my number " . $a; // also results in a 2,5

所以我的问题是,为什么 php 使用当前语言环境将类型double转换为字符串。就像在 Java 中一样,情况并非如此

Double a = 2.5;
System.out.println(a.toString()); // prints out 2.5
Locale.setDefault(Locale.GERMAN);
System.out.println(a.toString()); // still prints out 2.5

php使用当前设置的语言环境进行字符串转换有什么原因吗?

4

1 回答 1

2

我认为您的意思是使用printf("%f", $a);(因为您的代码在这里可以正常工作)。答案位于文档中:

http://fr2.php.net/manual/en/function.sprintf.php

f - 参数被视为浮点数,并显示为浮点数(区域设置感知)。

F - 参数被视为浮点数,并显示为浮点数(非语言环境感知)。自 PHP 4.3.10 和 PHP 5.0.3 起可用。

所以你应该使用%F

于 2013-05-26T20:45:08.430 回答