- 在 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