diff --git a/library/HTMLPurifier/UnitConverter.php b/library/HTMLPurifier/UnitConverter.php
index 2410c7e9..f4d29037 100644
--- a/library/HTMLPurifier/UnitConverter.php
+++ b/library/HTMLPurifier/UnitConverter.php
@@ -149,12 +149,18 @@ class HTMLPurifier_UnitConverter
// Calculations will always be carried to the decimal; this is
// a limitation with BC (we can't set the scale to be negative)
$new_log = (int) floor(log($n, 10));
-
- $rp = $sigfigs - $new_log - $log - 1;
- if ($rp < 0) $rp = 0;
-
- $n = bcadd($n, '0.' . str_repeat('0', $rp) . '5', $rp + 1);
- $n = bcdiv($n, '1', $rp);
+ $rp = $sigfigs - $new_log - 1;
+ //echo "----\n";
+ //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n";
+ if ($rp >= 0) {
+ $n = bcadd($n, '0.' . str_repeat('0', $rp) . '5', $rp + 1);
+ $n = bcdiv($n, '1', $rp);
+ } else {
+ if ($new_log + 1 >= $sigfigs) {
+ $n = bcadd($n, '5' . str_repeat('0', $new_log - $sigfigs));
+ $n = substr($n, 0, $sigfigs) . str_repeat('0', $new_log + 1 - $sigfigs);
+ }
+ }
if (strpos($n, '.') !== false) $n = rtrim($n, '0');
$n = rtrim($n, '.');
diff --git a/tests/HTMLPurifier/UnitConverterTest.php b/tests/HTMLPurifier/UnitConverterTest.php
index b2c1cb6a..80ba70dc 100644
--- a/tests/HTMLPurifier/UnitConverterTest.php
+++ b/tests/HTMLPurifier/UnitConverterTest.php
@@ -39,4 +39,12 @@ class HTMLPurifier_UnitConverterTest extends HTMLPurifier_Harness
$this->assertConversion('0.3937in', '1cm');
}
+ function testRounding() {
+ $this->assertConversion('100pt', '1.389in');
+ $this->assertConversion('1000pt', '13.89in');
+ $this->assertConversion('10000pt', '138.9in');
+ $this->assertConversion('100000pt', '1389in');
+ $this->assertConversion('1000000pt', '13890in');
+ }
+
}