我浪费了一些时间在与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是使用当前设置的区域设置的字符串转换?
我想你的意思是使用printf("%f", $a);
(因为你的代码在这里工作得很好)。答案在文档中:
所以你应该使用f -参数被视为浮点数,并表示为浮点数(语言环境敏感)。
F -参数被视为浮点数,并表示为浮点数(非语言环境感知)。从PHP 4.3.10和PHP 5.0.3开始提供。
%F