2

我想將偶爾的小數值存儲在我的MySQL數據庫中,並將它們顯示在我的PHP應用程序中。讓我解釋一下,偶爾的十進制值是什麼意思。這些數字在大多數時間都是整數。例如,160或170等。但有時我需要保存98.6的值。PHP和MySQL中用於存儲偶爾小數值的浮點精度問題

首先我在數據庫中使用了DECIMAL(4,1)數據類型,我發現我總是得到這樣的數字:160.0,170.0和98.6等。所以,我將它改爲FLOAT。在我的本地環境中,我看到在PHP應用程序和phpMyAdmin上的數字爲160,170,98.6等。但在我的生產環境中,我在phpMyAdmin上看到了諸如160,170,98.6等數字。但在PHP應用程序中,我看到的數字如160,170,98.599998474121等。

現在我需要決定是否切換回decimal或繼續使用float。無論哪種方式,我需要找到一個解決方案,將數字轉換爲這樣的格式:160,170和98.6等。

您認爲哪種方式更適合此目的:decimalfloat?如果數字的小數部分爲零(當使用decimal時),將數字轉換爲整數的最佳方法是什麼?將98.599998474121等浮點值轉換爲98.6的最佳方法是什麼?

轉換數字爲整數,如果數的小數部分是零:

<?php 
if (fmod($number, 1) == 0) { 
    $number = intval($number) 
} 

有沒有什麼更好的辦法?

+0

在保存使用時,在mysql和PHP中使用float數據類型:'$ foo =「105」; echo number_format((float)$ foo,2,'。',''); //輸出 - > 105.00' –

+0

FLOAT(1)似乎是要走的路,對嗎? – Strawberry

+0

@Strawberry,你的意思是FLOAT(1)作爲一個鏈接? PHP或MySQL相關? 「互聯網搜索」並不具體。我誤解你的觀點 - 只是困惑。 –

回答

0

瞭解float不是一個精確的十進制數,而是一個接近它的值。它的存儲方式非常高效,但代價並不十分精確。在不知道確切需求的情況下,一種可能的解決方案是將數字存儲爲浮點數並將其舍入到小數點後一位。

// the casts are there just for the demonstration, you probably don't need them 
$number = "170"; 
echo round((float)$number, 1); // gives 170 
$number = "98.6"; 
echo round((float)$number, 1); // gives 98.6 

浮點數表示整數你想要的方式,只有當你存儲某些小數時纔會失去精度。

+0

我不知道「round」是否將零數字刪除。這適用於'decimal'數據類型。 – Debiprasad

0

我也遇到過這個錯誤。 (閱讀http://www.leaseweblabs.com/2013/06/the-php-floating-point-precision-is-wrong-by-default/

這是一個php相關的錯誤。

如果你肯定知道你的小數部分的最大一個數字的,你遇到更多的,你知道你需要重新處理的數量

你可以得到精確度,像這樣:

function precision($num) { 
    return strlen(substr($num, strpos($num, '.')+1)); 
} 
+0

我不認爲這是一個很好的解決方案,因爲98.599998474121會變成98.5而不是98.6。 – Debiprasad

+0

我也嘗試在'php.ini'中更改'精度',但這也不起作用。 – Debiprasad

+0

你知道我建議的函數返回長度,而不是子字符串,對嗎?這純粹是計算'。'之後的數字的數量。 。 –