提交 a64c34d1 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Reimplement DateTimeUtils.convertScale() without BigDecimal

上级 40e2d338
......@@ -6,7 +6,6 @@
*/
package org.h2.util;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
......@@ -20,7 +19,6 @@ import org.h2.engine.Mode;
import org.h2.message.DbException;
import org.h2.value.Value;
import org.h2.value.ValueDate;
import org.h2.value.ValueDecimal;
import org.h2.value.ValueNull;
import org.h2.value.ValueTime;
import org.h2.value.ValueTimestamp;
......@@ -71,6 +69,12 @@ public class DateTimeUtils {
private static final int[] DAYS_OFFSET = { 0, 31, 61, 92, 122, 153, 184,
214, 245, 275, 306, 337, 366 };
/**
* Multipliers for {@link #convertScale(long, int)}.
*/
private static final int[] CONVERT_SCALE_TABLE = { 1_000_000_000, 100_000_000,
10_000_000, 1_000_000, 100_000, 10_000, 1_000, 100, 10 };
/**
* The thread local. Can not override initialValue because this would result
* in an inner class, which would not be garbage collected in a web
......@@ -1458,11 +1462,16 @@ public class DateTimeUtils {
* @return scaled value
*/
public static long convertScale(long nanosOfDay, int scale) {
BigDecimal bd = BigDecimal.valueOf(nanosOfDay);
bd = bd.movePointLeft(9);
bd = ValueDecimal.setScale(bd, scale);
bd = bd.movePointRight(9);
return bd.longValue();
if (scale >= 9) {
return nanosOfDay;
}
int m = CONVERT_SCALE_TABLE[scale];
long r = nanosOfDay / m;
int d = (int) (nanosOfDay - (r * m));
if (d >= m >>> 1) {
r++;
}
return r * m;
}
}
......@@ -46,6 +46,7 @@ public class TestDateTimeUtils extends TestBase {
testWeekOfYear();
testDateValueFromDenormalizedDate();
testUTC2Value(false);
testConvertScale();
}
private void testParseTimeNanosDB2Format() {
......@@ -160,4 +161,37 @@ public class TestDateTimeUtils extends TestBase {
}
}
private void testConvertScale() {
assertEquals(555_555_555_555L, DateTimeUtils.convertScale(555_555_555_555L, 9));
assertEquals(555_555_555_550L, DateTimeUtils.convertScale(555_555_555_554L, 8));
assertEquals(555_555_555_500L, DateTimeUtils.convertScale(555_555_555_549L, 7));
assertEquals(555_555_555_000L, DateTimeUtils.convertScale(555_555_555_499L, 6));
assertEquals(555_555_550_000L, DateTimeUtils.convertScale(555_555_554_999L, 5));
assertEquals(555_555_500_000L, DateTimeUtils.convertScale(555_555_549_999L, 4));
assertEquals(555_555_000_000L, DateTimeUtils.convertScale(555_555_499_999L, 3));
assertEquals(555_550_000_000L, DateTimeUtils.convertScale(555_554_999_999L, 2));
assertEquals(555_500_000_000L, DateTimeUtils.convertScale(555_549_999_999L, 1));
assertEquals(555_000_000_000L, DateTimeUtils.convertScale(555_499_999_999L, 0));
assertEquals(555_555_555_555L, DateTimeUtils.convertScale(555_555_555_555L, 9));
assertEquals(555_555_555_560L, DateTimeUtils.convertScale(555_555_555_555L, 8));
assertEquals(555_555_555_600L, DateTimeUtils.convertScale(555_555_555_550L, 7));
assertEquals(555_555_556_000L, DateTimeUtils.convertScale(555_555_555_500L, 6));
assertEquals(555_555_560_000L, DateTimeUtils.convertScale(555_555_555_000L, 5));
assertEquals(555_555_600_000L, DateTimeUtils.convertScale(555_555_550_000L, 4));
assertEquals(555_556_000_000L, DateTimeUtils.convertScale(555_555_500_000L, 3));
assertEquals(555_560_000_000L, DateTimeUtils.convertScale(555_555_000_000L, 2));
assertEquals(555_600_000_000L, DateTimeUtils.convertScale(555_550_000_000L, 1));
assertEquals(556_000_000_000L, DateTimeUtils.convertScale(555_500_000_000L, 0));
assertEquals(100_999_999_999L, DateTimeUtils.convertScale(100_999_999_999L, 9));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 8));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 7));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 6));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 5));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 4));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 3));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 2));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 1));
assertEquals(101_000_000_000L, DateTimeUtils.convertScale(100_999_999_999L, 0));
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论