检查小数点内包含哪些标志
Check which flags are included inside a decimal
我需要检查某个十进制变量中包含哪些十六进制标志。目前脚本只适用于小数,但我有一些更长的。
在下面的示例中,当我检查 $decimal2
中的标志时,它向我显示了正确的标志,但它不适用于 $decimal
。
我不知道这种行为的原因以及必须更改的内容。
这是example demo。
$decimal = 613090029426844e18; // doesn't work
$decimal2 = 64; //works
const FLAG_1 = 0x1;
const FLAG_2 = 0x2;
const FLAG_3 = 0x4;
const FLAG_4 = 0x4;
const FLAG_5 = 0x32;
const FLAG_6 = 0x40;
const FLAG_7 = 0x400;
function show_flags ($decimal) {
if ($decimal & FLAG_1) {
echo "Flag 1 included.<br>\n";
}
if ($decimal & FLAG_2) {
echo "Flag 2 included.<br>\n";
}
if ($decimal & FLAG_3) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_4) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_5) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_6) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_7) {
echo "Flag 3 included.<br>\n";
}
}
show_flags($decimal);
首先,none 的标志设置在您的 $decimal
中,因此预计不会打印任何内容。即使您确实设置了这些标志,比如将 0xfff
添加到 $decimal
,它仍然不会打印任何内容,因为数字太大而无法存储为 int
,因此它存储为精度有限的 float
。你可以用 var_dump()
看到这个
$decimal = 613090029426844e18; // doesn't work
$decimal2 = 64; //works
var_dump($decimal);
var_dump($decimal2);
输出:
float(6.13090029426844E+32)
int(64)
一个浮点数只存储最高有效位(大约14位),任何低位的数字都不可避免地被丢弃。
$decimal3 = 613090029426844e18 + 0xfff;
输出:
float(6.13090029426844E+32)
因此您将无法在大量使用低位有效数字。你可能想看看 BigInterger
class Is there a BigInteger class in PHP?
我需要检查某个十进制变量中包含哪些十六进制标志。目前脚本只适用于小数,但我有一些更长的。
在下面的示例中,当我检查 $decimal2
中的标志时,它向我显示了正确的标志,但它不适用于 $decimal
。
我不知道这种行为的原因以及必须更改的内容。
这是example demo。
$decimal = 613090029426844e18; // doesn't work
$decimal2 = 64; //works
const FLAG_1 = 0x1;
const FLAG_2 = 0x2;
const FLAG_3 = 0x4;
const FLAG_4 = 0x4;
const FLAG_5 = 0x32;
const FLAG_6 = 0x40;
const FLAG_7 = 0x400;
function show_flags ($decimal) {
if ($decimal & FLAG_1) {
echo "Flag 1 included.<br>\n";
}
if ($decimal & FLAG_2) {
echo "Flag 2 included.<br>\n";
}
if ($decimal & FLAG_3) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_4) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_5) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_6) {
echo "Flag 3 included.<br>\n";
}
if ($decimal & FLAG_7) {
echo "Flag 3 included.<br>\n";
}
}
show_flags($decimal);
首先,none 的标志设置在您的 $decimal
中,因此预计不会打印任何内容。即使您确实设置了这些标志,比如将 0xfff
添加到 $decimal
,它仍然不会打印任何内容,因为数字太大而无法存储为 int
,因此它存储为精度有限的 float
。你可以用 var_dump()
$decimal = 613090029426844e18; // doesn't work
$decimal2 = 64; //works
var_dump($decimal);
var_dump($decimal2);
输出:
float(6.13090029426844E+32)
int(64)
一个浮点数只存储最高有效位(大约14位),任何低位的数字都不可避免地被丢弃。
$decimal3 = 613090029426844e18 + 0xfff;
输出:
float(6.13090029426844E+32)
因此您将无法在大量使用低位有效数字。你可能想看看 BigInterger
class Is there a BigInteger class in PHP?