PHP科学记谱法缩短

时间:2013-04-06 02:55:28

标签: php decimal precision rounding scientific-notation

我正在寻找一个优雅的解决方案(如果存在)。

我有一堆数字,带有任意数量的小数位。我想强制数字使用8个小数位,如果它有超过8个尾随零,即

0.000000004321

那将转换为:

0.00000001

但我不想使用数字格式,因为如果我用数字格式强制它为8位小数,我的数字没有8位小数将会是这样的:

1.00000000

我宁愿这些看起来像(对于金额> = 1):

1.00700000 - > 1.01

对于金额< 1:

0.00300000 - > 0.003

如果数字小于1,即0.XX,我希望它具有更高的精度(最多8个,切断所有尾随的0)。

所以,再次,这里有一些例子可以说清楚:

1.00300000  -> 1.01 (maintain and round 2p for amounts >= 1)
0.00300000  -> 0.003 (maintaining precision, removing trailing 0's for amounts < 1)

1.00300001  -> 0.01 (maintain and round 2dp for amounts >= 1)
0.00300001  -> 0.00300001 (no change needed on this)
0.003000017 -> 0.00300002 (rounds upward to 8dp because it's < 1)

1.000000002 -> 1.00 (maintain and round 2dp for amounts >= 1)
0.000000002 -> 0.00000001 (rounds upward to 8dp because it's < 1)

目前,由于小数位数的原因,我的数字也很少用科学记数法表示。所以这是我需要担心的另一件事(即转换出科学记数法来进行计算)。

我知道我可以通过一堆通用逻辑来做到这一点,但它似乎是一种做事的hacky方式,肯定有一些很好的解决方案。

谢谢。

1 个答案:

答案 0 :(得分:1)

向上到第二名:ceil()

删除结束零:rtrim()

if($number >= 1)
{
    ceil to 2nd decimal place
}

else //when the number is less than 1
{
    ceil to 8th place
    try rtrim with '0' to remove ending zeros if there is any
}