]> granicus.if.org Git - icu/commitdiff
ICU-21493 Add more rounding modes in ICU4C
authorShane F. Carr <sffc@google.com>
Thu, 25 Feb 2021 02:49:16 +0000 (02:49 +0000)
committerShane F. Carr <shane@unicode.org>
Sat, 27 Feb 2021 18:25:08 +0000 (11:25 -0700)
See #1575

docs/userguide/format_parse/numbers/rounding-modes.md
icu4c/source/i18n/number_roundingutils.h
icu4c/source/i18n/number_skeletons.cpp
icu4c/source/i18n/number_skeletons.h
icu4c/source/i18n/unicode/unum.h
icu4c/source/test/cintltst/cnmdptst.c
icu4c/source/test/intltest/numbertest_decimalquantity.cpp

index cd02b8f14067491c8e95fa1033fec07cfcb24a82..7ff34f7c55f89c7d91d373c58e926cbb89a3974a 100644 (file)
@@ -30,50 +30,52 @@ definitions, but are equivalent to the same modes used in Java's JDK.
 This chart shows the values -2.0 through 2.0 in increments of 0.1, and shows the
 resulting ICU format when formatted with no decimal digits.
 
-| #    | CEILING | FLOOR | DOWN | UP | HALFEVEN | HALFDOWN | HALFUP | #    |
-|------|---------|-------|------|----|----------|----------|--------|------|
-| -2.0 | -2      | -2    | -2   | -2 | -2       | -2       | -2     | -2.0 |
-| -1.9 | -1      | -2    | -1   | -2 | -2       | -2       | -2     | -1.9 |
-| -1.8 | -1      | -2    | -1   | -2 | -2       | -2       | -2     | -1.8 |
-| -1.7 | -1      | -2    | -1   | -2 | -2       | -2       | -2     | -1.7 |
-| -1.6 | -1      | -2    | -1   | -2 | -2       | -2       | -2     | -1.6 |
-| -1.5 | -1      | -2    | -1   | -2 | -2       | -1       | -2     | -1.5 |
-| -1.4 | -1      | -2    | -1   | -2 | -1       | -1       | -1     | -1.4 |
-| -1.3 | -1      | -2    | -1   | -2 | -1       | -1       | -1     | -1.3 |
-| -1.2 | -1      | -2    | -1   | -2 | -1       | -1       | -1     | -1.2 |
-| -1.1 | -1      | -2    | -1   | -2 | -1       | -1       | -1     | -1.1 |
-| -1.0 | -1      | -1    | -1   | -1 | -1       | -1       | -1     | -1.0 |
-| -0.9 | -0      | -1    | -0   | -1 | -1       | -1       | -1     | -0.9 |
-| -0.8 | -0      | -1    | -0   | -1 | -1       | -1       | -1     | -0.8 |
-| -0.7 | -0      | -1    | -0   | -1 | -1       | -1       | -1     | -0.7 |
-| -0.6 | -0      | -1    | -0   | -1 | -1       | -1       | -1     | -0.6 |
-| -0.5 | -0      | -1    | -0   | -1 | -0       | -0       | -1     | -0.5 |
-| -0.4 | -0      | -1    | -0   | -1 | -0       | -0       | -0     | -0.4 |
-| -0.3 | -0      | -1    | -0   | -1 | -0       | -0       | -0     | -0.3 |
-| -0.2 | -0      | -1    | -0   | -1 | -0       | -0       | -0     | -0.2 |
-| -0.1 | -0      | -1    | -0   | -1 | -0       | -0       | -0     | -0.1 |
-| 0.0  | 0       | 0     | 0    | 0  | 0        | 0        | 0      | 0.0  |
-| 0.1  | 1       | 0     | 0    | 1  | 0        | 0        | 0      | 0.1  |
-| 0.2  | 1       | 0     | 0    | 1  | 0        | 0        | 0      | 0.2  |
-| 0.3  | 1       | 0     | 0    | 1  | 0        | 0        | 0      | 0.3  |
-| 0.4  | 1       | 0     | 0    | 1  | 0        | 0        | 0      | 0.4  |
-| 0.5  | 1       | 0     | 0    | 1  | 0        | 0        | 1      | 0.5  |
-| 0.6  | 1       | 0     | 0    | 1  | 1        | 1        | 1      | 0.6  |
-| 0.7  | 1       | 0     | 0    | 1  | 1        | 1        | 1      | 0.7  |
-| 0.8  | 1       | 0     | 0    | 1  | 1        | 1        | 1      | 0.8  |
-| 0.9  | 1       | 0     | 0    | 1  | 1        | 1        | 1      | 0.9  |
-| 1.0  | 1       | 1     | 1    | 1  | 1        | 1        | 1      | 1.0  |
-| 1.1  | 2       | 1     | 1    | 2  | 1        | 1        | 1      | 1.1  |
-| 1.2  | 2       | 1     | 1    | 2  | 1        | 1        | 1      | 1.2  |
-| 1.3  | 2       | 1     | 1    | 2  | 1        | 1        | 1      | 1.3  |
-| 1.4  | 2       | 1     | 1    | 2  | 1        | 1        | 1      | 1.4  |
-| 1.5  | 2       | 1     | 1    | 2  | 2        | 1        | 2      | 1.5  |
-| 1.6  | 2       | 1     | 1    | 2  | 2        | 2        | 2      | 1.6  |
-| 1.7  | 2       | 1     | 1    | 2  | 2        | 2        | 2      | 1.7  |
-| 1.8  | 2       | 1     | 1    | 2  | 2        | 2        | 2      | 1.8  |
-| 1.9  | 2       | 1     | 1    | 2  | 2        | 2        | 2      | 1.9  |
-| 2.0  | 2       | 2     | 2    | 2  | 2        | 2        | 2      | 2.0  |
-| #    | CEILING | FLOOR | DOWN | UP | HALFEVEN | HALFDOWN | HALFUP | #    |
+*Note: Some of the options below are not available in ICU4J because we use the JDK RoundingMode.*
+
+| #    | CEILING | FLOOR | DOWN | UP | HALFEVEN | HALFODD | HALFCEILING | HALFFLOOR | HALFDOWN | HALFUP | #    |
+|------|---------|-------|------|----|----------|---------|-------------|-----------|----------|--------|------|
+| -2.0 | -2      | -2    | -2   | -2 | -2       | -2      | -2          | -2        | -2       | -2     | -2.0 |
+| -1.9 | -1      | -2    | -1   | -2 | -2       | -2      | -2          | -2        | -2       | -2     | -1.9 |
+| -1.8 | -1      | -2    | -1   | -2 | -2       | -2      | -2          | -2        | -2       | -2     | -1.8 |
+| -1.7 | -1      | -2    | -1   | -2 | -2       | -2      | -2          | -2        | -2       | -2     | -1.7 |
+| -1.6 | -1      | -2    | -1   | -2 | -2       | -2      | -2          | -2        | -2       | -2     | -1.6 |
+| -1.5 | -1      | -2    | -1   | -2 | -2       | -1      | -1          | -2        | -1       | -2     | -1.5 |
+| -1.4 | -1      | -2    | -1   | -2 | -1       | -1      | -1          | -1        | -1       | -1     | -1.4 |
+| -1.3 | -1      | -2    | -1   | -2 | -1       | -1      | -1          | -1        | -1       | -1     | -1.3 |
+| -1.2 | -1      | -2    | -1   | -2 | -1       | -1      | -1          | -1        | -1       | -1     | -1.2 |
+| -1.1 | -1      | -2    | -1   | -2 | -1       | -1      | -1          | -1        | -1       | -1     | -1.1 |
+| -1.0 | -1      | -1    | -1   | -1 | -1       | -1      | -1          | -1        | -1       | -1     | -1.0 |
+| -0.9 | -0      | -1    | -0   | -1 | -1       | -1      | -1          | -1        | -1       | -1     | -0.9 |
+| -0.8 | -0      | -1    | -0   | -1 | -1       | -1      | -1          | -1        | -1       | -1     | -0.8 |
+| -0.7 | -0      | -1    | -0   | -1 | -1       | -1      | -1          | -1        | -1       | -1     | -0.7 |
+| -0.6 | -0      | -1    | -0   | -1 | -1       | -1      | -1          | -1        | -1       | -1     | -0.6 |
+| -0.5 | -0      | -1    | -0   | -1 | -0       | -1      | -0          | -1        | -0       | -1     | -0.5 |
+| -0.4 | -0      | -1    | -0   | -1 | -0       | -0      | -0          | -0        | -0       | -0     | -0.4 |
+| -0.3 | -0      | -1    | -0   | -1 | -0       | -0      | -0          | -0        | -0       | -0     | -0.3 |
+| -0.2 | -0      | -1    | -0   | -1 | -0       | -0      | -0          | -0        | -0       | -0     | -0.2 |
+| -0.1 | -0      | -1    | -0   | -1 | -0       | -0      | -0          | -0        | -0       | -0     | -0.1 |
+| 0.0  | 0       | 0     | 0    | 0  | 0        | 0       | 0           | 0         | 0        | 0      | 0.0  |
+| 0.1  | 1       | 0     | 0    | 1  | 0        | 0       | 0           | 0         | 0        | 0      | 0.1  |
+| 0.2  | 1       | 0     | 0    | 1  | 0        | 0       | 0           | 0         | 0        | 0      | 0.2  |
+| 0.3  | 1       | 0     | 0    | 1  | 0        | 0       | 0           | 0         | 0        | 0      | 0.3  |
+| 0.4  | 1       | 0     | 0    | 1  | 0        | 0       | 0           | 0         | 0        | 0      | 0.4  |
+| 0.5  | 1       | 0     | 0    | 1  | 0        | 1       | 1           | 0         | 0        | 1      | 0.5  |
+| 0.6  | 1       | 0     | 0    | 1  | 1        | 1       | 1           | 1         | 1        | 1      | 0.6  |
+| 0.7  | 1       | 0     | 0    | 1  | 1        | 1       | 1           | 1         | 1        | 1      | 0.7  |
+| 0.8  | 1       | 0     | 0    | 1  | 1        | 1       | 1           | 1         | 1        | 1      | 0.8  |
+| 0.9  | 1       | 0     | 0    | 1  | 1        | 1       | 1           | 1         | 1        | 1      | 0.9  |
+| 1.0  | 1       | 1     | 1    | 1  | 1        | 1       | 1           | 1         | 1        | 1      | 1.0  |
+| 1.1  | 2       | 1     | 1    | 2  | 1        | 1       | 1           | 1         | 1        | 1      | 1.1  |
+| 1.2  | 2       | 1     | 1    | 2  | 1        | 1       | 1           | 1         | 1        | 1      | 1.2  |
+| 1.3  | 2       | 1     | 1    | 2  | 1        | 1       | 1           | 1         | 1        | 1      | 1.3  |
+| 1.4  | 2       | 1     | 1    | 2  | 1        | 1       | 1           | 1         | 1        | 1      | 1.4  |
+| 1.5  | 2       | 1     | 1    | 2  | 2        | 1       | 2           | 1         | 1        | 2      | 1.5  |
+| 1.6  | 2       | 1     | 1    | 2  | 2        | 2       | 2           | 2         | 2        | 2      | 1.6  |
+| 1.7  | 2       | 1     | 1    | 2  | 2        | 2       | 2           | 2         | 2        | 2      | 1.7  |
+| 1.8  | 2       | 1     | 1    | 2  | 2        | 2       | 2           | 2         | 2        | 2      | 1.8  |
+| 1.9  | 2       | 1     | 1    | 2  | 2        | 2       | 2           | 2         | 2        | 2      | 1.9  |
+| 2.0  | 2       | 2     | 2    | 2  | 2        | 2       | 2           | 2         | 2        | 2      | 2.0  |
+| #    | CEILING | FLOOR | DOWN | UP | HALFEVEN | HALFODD | HALFCEILING | HALFFLOOR | HALFDOWN | HALFUP | #    |
 
 ### Half Even
 
@@ -84,6 +86,10 @@ default mode specified for IEEE 754 floating point operations.
 
 Also known as ties-to-even, round-to-nearest, RN or RNE.
 
+### Half Odd
+
+Similar to Half Even, but rounds ties to the nearest odd number instead of even number.
+
 ### Half Down
 
 Values exactly on the 0.5 (half) mark are rounded down (next smaller absolute
@@ -106,6 +112,16 @@ removed.
 
 All values are rounded towards the next greater absolute value (away from zero).
 
+### Half Ceiling
+
+Values exactly on the 0.5 (half) mark are rounded toward positive infinity (+∞).
+
+This is the default rounding mode in ECMAScript. In CSS, it is known as "nearest".
+
+### Half Floor
+
+Values exactly on the 0.5 (half) mark are rounded towards negative infinity (-∞).
+
 ### Ceiling
 
 All values are rounded towards positive infinity (+∞). Also known as RI for
index 11e70abda0708d2aa630c427ca6c35afcf55ad11..06fadd29fd544e032d367720052b56f4fd47d431 100644 (file)
@@ -104,6 +104,45 @@ getRoundingDirection(bool isEven, bool isNegative, Section section, RoundingMode
             }
             break;
 
+        case RoundingMode::UNUM_ROUND_HALF_ODD:
+            switch (section) {
+                case SECTION_MIDPOINT:
+                    return !isEven;
+                case SECTION_LOWER:
+                    return true;
+                case SECTION_UPPER:
+                    return false;
+                default:
+                    break;
+            }
+            break;
+
+        case RoundingMode::UNUM_ROUND_HALF_CEILING:
+            switch (section) {
+                case SECTION_MIDPOINT:
+                    return isNegative;
+                case SECTION_LOWER:
+                    return true;
+                case SECTION_UPPER:
+                    return false;
+                default:
+                    break;
+            }
+            break;
+
+        case RoundingMode::UNUM_ROUND_HALF_FLOOR:
+            switch (section) {
+                case SECTION_MIDPOINT:
+                    return !isNegative;
+                case SECTION_LOWER:
+                    return true;
+                case SECTION_UPPER:
+                    return false;
+                default:
+                    break;
+            }
+            break;
+
         default:
             break;
     }
index a07725bd2ed6570c462a8cb2ad33f99f9e79f3ad..0110e95e7c5f1007af1051f9599449d07520b49a 100644 (file)
@@ -68,6 +68,9 @@ void U_CALLCONV initNumberSkeletons(UErrorCode& status) {
     b.add(u"rounding-mode-down", STEM_ROUNDING_MODE_DOWN, status);
     b.add(u"rounding-mode-up", STEM_ROUNDING_MODE_UP, status);
     b.add(u"rounding-mode-half-even", STEM_ROUNDING_MODE_HALF_EVEN, status);
+    b.add(u"rounding-mode-half-odd", STEM_ROUNDING_MODE_HALF_ODD, status);
+    b.add(u"rounding-mode-half-ceiling", STEM_ROUNDING_MODE_HALF_CEILING, status);
+    b.add(u"rounding-mode-half-floor", STEM_ROUNDING_MODE_HALF_FLOOR, status);
     b.add(u"rounding-mode-half-down", STEM_ROUNDING_MODE_HALF_DOWN, status);
     b.add(u"rounding-mode-half-up", STEM_ROUNDING_MODE_HALF_UP, status);
     b.add(u"rounding-mode-unnecessary", STEM_ROUNDING_MODE_UNNECESSARY, status);
@@ -217,6 +220,12 @@ UNumberFormatRoundingMode stem_to_object::roundingMode(skeleton::StemEnum stem)
             return UNUM_ROUND_UP;
         case STEM_ROUNDING_MODE_HALF_EVEN:
             return UNUM_ROUND_HALFEVEN;
+        case STEM_ROUNDING_MODE_HALF_ODD:
+            return UNUM_ROUND_HALF_ODD;
+        case STEM_ROUNDING_MODE_HALF_CEILING:
+            return UNUM_ROUND_HALF_CEILING;
+        case STEM_ROUNDING_MODE_HALF_FLOOR:
+            return UNUM_ROUND_HALF_FLOOR;
         case STEM_ROUNDING_MODE_HALF_DOWN:
             return UNUM_ROUND_HALFDOWN;
         case STEM_ROUNDING_MODE_HALF_UP:
@@ -320,6 +329,15 @@ void enum_to_stem_string::roundingMode(UNumberFormatRoundingMode value, UnicodeS
         case UNUM_ROUND_HALFEVEN:
             sb.append(u"rounding-mode-half-even", -1);
             break;
+        case UNUM_ROUND_HALF_ODD:
+            sb.append(u"rounding-mode-half-odd", -1);
+            break;
+        case UNUM_ROUND_HALF_CEILING:
+            sb.append(u"rounding-mode-half-ceiling", -1);
+            break;
+        case UNUM_ROUND_HALF_FLOOR:
+            sb.append(u"rounding-mode-half-floor", -1);
+            break;
         case UNUM_ROUND_HALFDOWN:
             sb.append(u"rounding-mode-half-down", -1);
             break;
@@ -672,6 +690,9 @@ skeleton::parseStem(const StringSegment& segment, const UCharsTrie& stemTrie, Se
         case STEM_ROUNDING_MODE_DOWN:
         case STEM_ROUNDING_MODE_UP:
         case STEM_ROUNDING_MODE_HALF_EVEN:
+        case STEM_ROUNDING_MODE_HALF_ODD:
+        case STEM_ROUNDING_MODE_HALF_CEILING:
+        case STEM_ROUNDING_MODE_HALF_FLOOR:
         case STEM_ROUNDING_MODE_HALF_DOWN:
         case STEM_ROUNDING_MODE_HALF_UP:
         case STEM_ROUNDING_MODE_UNNECESSARY:
index 5c1055b21c33abe4abdf980230ff1a0d9fdee901..cb3cdf3a87d46149edd8f5ac76b7f17ad92644dc 100644 (file)
@@ -85,6 +85,9 @@ enum StemEnum {
     STEM_ROUNDING_MODE_DOWN,
     STEM_ROUNDING_MODE_UP,
     STEM_ROUNDING_MODE_HALF_EVEN,
+    STEM_ROUNDING_MODE_HALF_ODD,
+    STEM_ROUNDING_MODE_HALF_CEILING,
+    STEM_ROUNDING_MODE_HALF_FLOOR,
     STEM_ROUNDING_MODE_HALF_DOWN,
     STEM_ROUNDING_MODE_HALF_UP,
     STEM_ROUNDING_MODE_UNNECESSARY,
index 705e6fee2a26a065a72203f150790998f862e5c2..6bcb7f650cda71ce73c0135e83387a13c05d7018 100644 (file)
@@ -302,7 +302,24 @@ typedef enum UNumberFormatRoundingMode {
       * ROUND_UNNECESSARY reports an error if formatted result is not exact.
       * @stable ICU 4.8
       */
-    UNUM_ROUND_UNNECESSARY
+    UNUM_ROUND_UNNECESSARY,
+#ifndef U_HIDE_DRAFT_API
+    /**
+     * Rounds ties toward the odd number.
+     * @draft ICU 69
+     */
+    UNUM_ROUND_HALF_ODD,
+    /**
+     * Rounds ties toward +∞.
+     * @draft ICU 69
+     */
+    UNUM_ROUND_HALF_CEILING,
+    /**
+     * Rounds ties toward -∞.
+     * @draft ICU 69
+     */
+    UNUM_ROUND_HALF_FLOOR,
+#endif
 } UNumberFormatRoundingMode;
 
 /** The possible number format pad positions. 
index c2522593440d853d2e168961b045782d982daa14..de5e7107e4bbf15c358d6adfd2e6f561c93d01dd 100644 (file)
@@ -968,7 +968,12 @@ static void TestRounding5350(void)
     roundingTest2(nnf, -0.125, UNUM_ROUND_FLOOR, "-0.13");
     roundingTest2(nnf, -0.125, UNUM_ROUND_DOWN, "-0.12");
     roundingTest2(nnf, -0.125, UNUM_ROUND_UP, "-0.13");
-    roundingTest2(nnf, 0.125, UNUM_FOUND_HALFEVEN, "0.12");
+    roundingTest2(nnf, 0.125, UNUM_ROUND_HALFEVEN, "0.12");
+    roundingTest2(nnf, 0.135, UNUM_ROUND_HALF_ODD, "0.13");
+    roundingTest2(nnf, 0.135, UNUM_ROUND_HALF_CEILING, "0.14");
+    roundingTest2(nnf, -0.135, UNUM_ROUND_HALF_CEILING, "-0.13");
+    roundingTest2(nnf, 0.135, UNUM_ROUND_HALF_FLOOR, "0.13");
+    roundingTest2(nnf, -0.135, UNUM_ROUND_HALF_FLOOR, "-0.14");
     roundingTest2(nnf, 0.135, UNUM_ROUND_HALFDOWN, "0.13");
     roundingTest2(nnf, 0.125, UNUM_ROUND_HALFUP, "0.13");
     roundingTest2(nnf, 0.135, UNUM_FOUND_HALFEVEN, "0.14");
@@ -984,6 +989,9 @@ static void TestRounding5350(void)
     roundingTest2(nnf, 1.0000001, UNUM_ROUND_DOWN, "1");
     roundingTest2(nnf, 1.0000001, UNUM_ROUND_UP, "1.01");
     roundingTest2(nnf, 1.0000001, UNUM_FOUND_HALFEVEN, "1");
+    roundingTest2(nnf, 1.0000001, UNUM_ROUND_HALF_ODD, "1");
+    roundingTest2(nnf, 1.0000001, UNUM_ROUND_HALF_CEILING, "1");
+    roundingTest2(nnf, 1.0000001, UNUM_ROUND_HALF_FLOOR, "1");
     roundingTest2(nnf, 1.0000001, UNUM_ROUND_HALFDOWN, "1");
     roundingTest2(nnf, 1.0000001, UNUM_ROUND_HALFUP, "1");
 
@@ -992,6 +1000,9 @@ static void TestRounding5350(void)
     roundingTest2(nnf, -1.0000001, UNUM_ROUND_DOWN, "-1");
     roundingTest2(nnf, -1.0000001, UNUM_ROUND_UP, "-1.01");
     roundingTest2(nnf, -1.0000001, UNUM_FOUND_HALFEVEN, "-1");
+    roundingTest2(nnf, -1.0000001, UNUM_ROUND_HALF_ODD, "-1");
+    roundingTest2(nnf, -1.0000001, UNUM_ROUND_HALF_CEILING, "-1");
+    roundingTest2(nnf, -1.0000001, UNUM_ROUND_HALF_FLOOR, "-1");
     roundingTest2(nnf, -1.0000001, UNUM_ROUND_HALFDOWN, "-1");
     roundingTest2(nnf, -1.0000001, UNUM_ROUND_HALFUP, "-1");
 
index 9339396e41ccac8aace020dace19161e64eafac5..74b97a9ef4224d622fb4bd5b50e535603760533f 100644 (file)
@@ -413,6 +413,9 @@ void DecimalQuantityTest::testNickelRounding() {
         {1.024, -2, UNUM_ROUND_HALFEVEN, u"1"},
         {1.025, -2, UNUM_ROUND_HALFEVEN, u"1"},
         {1.025, -2, UNUM_ROUND_HALFDOWN, u"1"},
+        {1.025, -2, UNUM_ROUND_HALF_ODD, u"1.05"},
+        {1.025, -2, UNUM_ROUND_HALF_CEILING, u"1.05"},
+        {1.025, -2, UNUM_ROUND_HALF_FLOOR, u"1"},
         {1.025, -2, UNUM_ROUND_HALFUP,   u"1.05"},
         {1.026, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
         {1.030, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
@@ -422,6 +425,9 @@ void DecimalQuantityTest::testNickelRounding() {
         {1.070, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
         {1.074, -2, UNUM_ROUND_HALFEVEN, u"1.05"},
         {1.075, -2, UNUM_ROUND_HALFDOWN, u"1.05"},
+        {1.075, -2, UNUM_ROUND_HALF_ODD, u"1.05"},
+        {1.075, -2, UNUM_ROUND_HALF_CEILING, u"1.1"},
+        {1.075, -2, UNUM_ROUND_HALF_FLOOR, u"1.05"},
         {1.075, -2, UNUM_ROUND_HALFUP,   u"1.1"},
         {1.075, -2, UNUM_ROUND_HALFEVEN, u"1.1"},
         {1.076, -2, UNUM_ROUND_HALFEVEN, u"1.1"},
@@ -432,6 +438,9 @@ void DecimalQuantityTest::testNickelRounding() {
         {2.25, -1, UNUM_ROUND_HALFEVEN, u"2"},
         {2.25, -1, UNUM_ROUND_HALFUP,   u"2.5"},
         {2.75, -1, UNUM_ROUND_HALFDOWN, u"2.5"},
+        {2.75, -1, UNUM_ROUND_HALF_ODD, u"2.5"},
+        {2.75, -1, UNUM_ROUND_HALF_CEILING, u"3"},
+        {2.75, -1, UNUM_ROUND_HALF_FLOOR, u"2.5"},
         {2.75, -1, UNUM_ROUND_HALFEVEN, u"3"},
         {3.00, -1, UNUM_ROUND_CEILING, u"3"},
         {3.25, -1, UNUM_ROUND_CEILING, u"3.5"},