科学的記数法の数値を含む文字列をdoubleに変換するのに助けが必要です。
文字列の例: "1.8281e-009" "2.3562e-007" "0.911348"
私は、数値を左側の数値と指数に分割し、数学を実行して数値を生成することを考えていました。しかし、これを行うためのより良い/標準的な方法はありますか?
PHPは タイプレス 動的に型付けされます。つまり、値を解析して型を判別する必要があります(最近のバージョンのPHP have type宣言 )。
あなたの場合、単に数値演算を実行して、PHPに値を数値と見なすように強制することができます(そしてそれは科学的記数法x.yE-z
を理解します)。
たとえば試してみてください
foreach (array("1.8281e-009","2.3562e-007","0.911348") as $a)
{
echo "String $a: Number: " . ($a + 1) . "\n";
}
1を加算するだけで(ゼロを減算することもできます)、文字列は適切な小数の数値になります。
結果:
String 1.8281e-009: Number: 1.0000000018281
String 2.3562e-007: Number: 1.00000023562
String 0.911348: Number: 1.911348
(float)
を使用して結果をキャストすることもできます
$real = (float) "3.141592e-007";
$f = (float) "1.8281e-009";
var_dump($f); // float(1.8281E-9)
$float = sprintf('%f', $scientific_notation);
$integer = sprintf('%d', $scientific_notation);
if ($float == $integer)
{
// this is a whole number, so remove all decimals
$output = $integer;
}
else
{
// remove trailing zeroes from the decimal portion
$output = rtrim($float,'0');
$output = rtrim($output,'.');
}
Number_formatを使用して、値を浮動小数点の科学的記数法の数値から非科学的記数法の数値に変換する投稿を見つけました。
http://jetlogs.org/2008/02/05/php-problems-with-big-integers-and-scientific-notation/
編集者注:リンクが腐っている
投稿の例:
$big_integer = 1202400000;
$formatted_int = number_format($big_integer, 0, '.', '');
echo $formatted_int; //outputs 1202400000 as expected
HTH
function decimal_notation($float) {
$parts = explode('E', $float);
if(count($parts) === 2){
$exp = abs(end($parts)) + strlen($parts[0]);
$decimal = number_format($float, $exp);
return rtrim($decimal, '.0');
}
else{
return $float;
}
}
0.000077240388で動作します
number_format()
関数とrtrim()
関数を一緒に使用します。例えば
//eg $sciNotation = 2.3649E-8
$number = number_format($sciNotation, 10); //Use $dec_point large enough
echo rtrim($number, '0'); //Remove trailing zeros
より多くの関数を使用して関数を作成しました(しゃれは意図されていません)
function decimalNotation($num){
$parts = explode('E', $num);
if(count($parts) != 2){
return $num;
}
$exp = abs(end($parts)) + 3;
$decimal = number_format($num, $exp);
$decimal = rtrim($decimal, '0');
return rtrim($decimal, '.');
}
+ 1、-1、/ 1の解決策を試しましたが、後でround($ a、4)などを使用して数値を丸めないと十分ではありませんでした。