這裡有一個計算
$data = [
[
"id" => 9,
"user_id" => 2,
"value" => 0.000013
],
[
"id" => 19,
"user_id" => 2,
"value" => 0.000009
]
];
$sumValue = collect($data)->sum('value');
\Log::info('$sumValue:' . $sumValue);
// 結果:$sumValue:2.2E-5 是科學記數法
\Log::info('bcadd:' . bcadd($sumValue, 0, 8));
// 結果: bcadd:0.00000000
\Log::info('sprintf:' . sprintf('%.8f', $sumValue));
// 結果:sprintf:0.00002200
bcadd 數字、字串、科學記數法型別的計算結果
1、數值
1) 4位小數,且前4位為0的
\Log::info('bcadd:' . bcadd(0.00002200, 0, 8));
// 結果:bcadd:0.00000000
2) 5位小數,且前4位有大於0的
\Log::info('bcadd:' . bcadd(0.00012200, 0, 8));
// 結果:bcadd:0.00012200
2、字串
\Log::info('bcadd:' . bcadd('0.00002200', 0, 8));
// 等同於 \Log::info('bcadd:' . bcadd((string)0.00012200, 0, 8));
// 結果:bcadd:0.00002200
3、科學ji數法
1) 5位小數,且前4位有大於0的
\Log::info('bcadd:' . bcadd(2.2E-4, 0, 8));
// 結果:bcadd:0.00022000
2) 5位小數,且第4位等於0
\Log::info('bcadd:' . bcadd(2.2E-5, 0, 8));
// 結果:bcadd:0.00000000
3) 5為小數,第4位大於0
\Log::info('bcadd:' . bcadd(12.2E-5, 0, 8));
// 結果:bcadd:0.00012200
結論是超過4位小數,且前4位都為0時,如不轉為字串進行bcadd計算,那麼精度會有問題,結果會按0來計算;高精度計算,建議先轉為字串再進行計算。
根據需要,提前轉為精度+1的字串型別參與計算,如需保留6位,就取7位出來
$value = 0.000011;
$value = sprintf('%.7f', $value);
儲存資料時,可轉再轉為6位
$model->value = bcadd($value, 0, 6);
$model->save();
本作品採用《CC 協議》,轉載必須註明作者和本文連結