- 在 echo 表达式中实现 BigInt、BigFloat 和 Decimal 类型的自动 toString 转换 - 为 abs、pow、sqrt、floor、ceil、round 数学函数添加 Big* 类型返回值推断 - 优化二进制连接操作中的类型转换逻辑,支持 Big* 类型到字符串的转换 - 为 (string) 强制转换、strval() 函数和 floor/ceil/round 函数添加 Big* 类型支持 - 新增测试用例验证 Big* 类型的数学函数优化功能 - 添加 Decimal 类型的精确计算和舍入处理示例pull/1/head
parent
5129bab900
commit
c604fc09ab
7 changed files with 241 additions and 6 deletions
@ -0,0 +1,10 @@ |
||||
<?php |
||||
|
||||
use decimal_types; |
||||
|
||||
function main() |
||||
{ |
||||
$a = 0.1 + 0.2; |
||||
$b = 1000; |
||||
echo $a, $b; |
||||
} |
||||
@ -0,0 +1,33 @@ |
||||
--TEST-- |
||||
Big* types: math function optimization (abs/pow/sqrt/floor/ceil/round) |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
// BigInt |
||||
$a = std::bigInt("100"); |
||||
$a1 = abs($a); |
||||
$a2 = pow($a, 2); |
||||
$a3 = sqrt($a); |
||||
|
||||
// Decimal |
||||
$b = std::decimal("3.14"); |
||||
$b1 = abs($b); |
||||
$b2 = pow($b, 3); |
||||
$b3 = sqrt($b); |
||||
$b4 = floor($b); |
||||
$b5 = ceil($b); |
||||
$b6 = round($b); |
||||
$b7 = round(std::decimal("3.14159"), 2); |
||||
|
||||
// BigFloat |
||||
$c = std::bigFloat("-2.5"); |
||||
$c1 = abs($c); |
||||
|
||||
echo "OK\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
OK |
||||
@ -0,0 +1,37 @@ |
||||
--TEST-- |
||||
Big* types: (string) cast, strval() and echo → toString() |
||||
--FILE-- |
||||
<?php |
||||
declare(strict_types=1); |
||||
use native_types; |
||||
|
||||
function main(): void { |
||||
// BigInt |
||||
$a = std::bigInt("12345678901234567890"); |
||||
var_dump((string) $a); |
||||
var_dump(strval($a)); |
||||
echo $a; echo "\n"; |
||||
|
||||
// BigFloat |
||||
$b = std::bigFloat("3.141592653589793"); |
||||
var_dump((string) $b); |
||||
var_dump(strval($b)); |
||||
echo $b; echo "\n"; |
||||
|
||||
// Decimal |
||||
$c = std::decimal("0.123456789"); |
||||
var_dump((string) $c); |
||||
var_dump(strval($c)); |
||||
echo $c; echo "\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
string(20) "12345678901234567890" |
||||
string(20) "12345678901234567890" |
||||
12345678901234567890 |
||||
string(18) "3.1415926535897931" |
||||
string(18) "3.1415926535897931" |
||||
3.1415926535897931 |
||||
string(11) "0.123456789" |
||||
string(11) "0.123456789" |
||||
0.123456789 |
||||
@ -0,0 +1,17 @@ |
||||
--TEST-- |
||||
decimal: literal |
||||
--FILE-- |
||||
<?php |
||||
use decimal_types; |
||||
|
||||
function main() |
||||
{ |
||||
require __DIR__ . '/../../../src/Assert.php'; |
||||
$amount = 19.99; |
||||
$rate = 0.09; |
||||
$tax = $amount * $rate; // 1.7991 —— Decimal 精确计算 |
||||
echo floor($tax * 100) / 100.0; // floor(179.91) / 100.0 = 1.79 |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
1.79 |
||||
@ -0,0 +1,25 @@ |
||||
--TEST-- |
||||
Decimal: round |
||||
--FILE-- |
||||
<?php |
||||
use decimal_types; |
||||
|
||||
function main(): void { |
||||
$item1 = 19.99; // 商品A |
||||
$item2 = 29.99; // 商品B |
||||
$item3 = 39.99; // 商品C |
||||
$tax_rate = 0.08; |
||||
|
||||
$subtotal = $item1 + $item2 + $item3; |
||||
$tax = $subtotal * $tax_rate; |
||||
$total = $subtotal + $tax; |
||||
|
||||
echo "小计: " . round($subtotal, 2) . "\n"; // 89.97 |
||||
echo "税额: " . round($tax, 4) . "\n"; // 7.1976 |
||||
echo "总计: " . round($total, 2) . "\n"; // 97.17 |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
小计: 89.97 |
||||
税额: 7.1976 |
||||
总计: 97.17 |
||||
Loading…
Reference in new issue