с плавающей запятой — Почему вычитание числа с плавающей запятой в PHP отличается от C

Код C

#include <stdio.h>

union
{
float f;
unsigned int u;
} myun;int main ( void )
{
float a,b,c;

a= 4501.490234;
b= 4501;

c=a-b;

myun.f=a; printf("0x%08X %f\n",myun.u,myun.f);
myun.f=b; printf("0x%08X %f\n",myun.u,myun.f);
myun.f=c; printf("0x%08X %f\n",myun.u,myun.f);

return(0);
}

Результат:

0x458CABEC 4501.490234
0x458CA800 4501.000000
0x3EFB0000 0.490234

Мой код PHP:

<?php
$a = 4501.490234;
$b = 4501;
$c = $a - $b;
echo bin2hex(pack("f", $a))."\n";
echo bin2hex(pack("f", $b))."\n";
echo bin2hex(pack("f", $c))."\n";

$r = unpack('ffloat',"\x00\x00\xFB\x3E");
echo $r['float']."\n";

И результат:

ecab8c45
00a88c45
f3fffa3e
0.490234375

Итак, есть две проблемы.
1. Различные результаты вычитания: f3fffa3e и 0x3EFB0000
2. Даже один и тот же 0x3EFB0000 имеет разные представления: 0.490234375 и 0.490234.

3

Решение

  1. Вам нужно вывести номер с тем же Percision

  2. c float использует 4 байта для хранения номера, php float всегда использует 8 байтов для хранения номера.

Проверьте свой код с двойным.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]