Felet är enkelt att återskapa:
$T = 3179.12;
echo $T."<br />";
var_dump($T);
echo "<br />";
var_export($T);
Ger följande:
3179.12
float(3179.12)
3179.1199999999999
1 svar · 143 visningar · startad av MickeA.com
Hej!
Följande funktion konverterar en sträng till float:
function str2amount($amount, $allowSignal=true){
$sign = 1;
if ( is_string($amount) ) {
$amount = trim($amount);
if ( empty($amount) ) return "";
}
if ( !is_numeric($amount) ) {
if ( $allowSignal && preg_match("/^\d+å|[JKLMNOPQR]$/", $amount) ) {
//Transform to negative amount
$sign = -1;
$ptrns = array(
"/^(\d+)å$/",
"/^(\d+)J$/",
"/^(\d+)K$/",
"/^(\d+)L$/",
"/^(\d+)M$/",
"/^(\d+)N$/",
"/^(\d+)O$/",
"/^(\d+)P$/",
"/^(\d+)Q$/",
"/^(\d+)R$/",
);
$replace = array(
'${1}0',
'${1}1',
'${1}2',
'${1}3',
'${1}4',
'${1}5',
'${1}6',
'${1}7',
'${1}8',
'${1}9',
);
$amount = preg_replace($ptrns, $replace, $amount);
} else {
$this->error(_('Ogiltigt belopp, inte ett tal.'));
return false;
}
}
$amount = ltrim($amount, '0');
if ( strlen($amount) > strlen((string)PHP_INT_MAX)+1 ) {
$this->error(_('Kunde inte konvertera till decimal. Tal för långt.'));
return false;
}
$amount = preg_replace("/(\d*)(\d\d)$/", "$1.$2", $amount, 1);
return floatval($amount)*$sign;
}
Jag läser in tal som strängar i formatet 1234567 och ut kommer ett formaterat tal (float) i formatet 12345.67
Problemet är att i vissa fall läggs 10 decimaler på, och jag förstår inte varför.
Jag skickar in följande till funktionen:
string(18) "000000000000685691"
Sen blir det problem
var_dump: float(6856.91)
var_export: 6856.9099999999999
Iom det här blir en beräkning helt fel. Har ingen aning om hur jag ska få rätt på antal decimaler, något som vet?
Tack!
Felet är enkelt att återskapa:
$T = 3179.12;
echo $T."<br />";
var_dump($T);
echo "<br />";
var_export($T);
Ger följande:
3179.12
float(3179.12)
3179.1199999999999