1 // DecimalTest.cs - NUnit Test Cases for the System.Decimal struct
4 // Martin Weindel (martin.weindel@t-online.de)
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) Martin Weindel, 2001
8 // Copyright (C) 2004 Novell (http://www.novell.com)
11 using NUnit.Framework;
14 using System.Globalization;
15 using System.Runtime.CompilerServices;
16 using System.Threading;
18 namespace MonoTests.System
20 internal struct ParseTest
22 public ParseTest (String str, bool exceptionFlag)
25 this.exceptionFlag = exceptionFlag;
26 this.style = NumberStyles.Number;
30 public ParseTest (String str, Decimal d)
33 this.exceptionFlag = false;
34 this.style = NumberStyles.Number;
38 public ParseTest (String str, Decimal d, NumberStyles style)
41 this.exceptionFlag = false;
48 public NumberStyles style;
49 public bool exceptionFlag;
52 internal struct ToStringTest
54 public ToStringTest (String format, Decimal d, String str)
67 public class DecimalTest : Assertion
69 private const int negativeBitValue = unchecked ((int) 0x80000000);
70 private const int negativeScale4Value = unchecked ((int) 0x80040000);
71 private int [] parts0 = { 0, 0, 0, 0 }; //Positive Zero.
72 private int [] parts1 = { 1, 0, 0, 0 };
73 private int [] parts2 = { 0, 1, 0, 0 };
74 private int [] parts3 = { 0, 0, 1, 0 };
75 private int [] parts4 = { 0, 0, 0, negativeBitValue }; // Negative zero.
76 private int [] parts5 = { 1, 1, 1, 0 };
77 private int [] partsMaxValue = { -1, -1, -1, 0 };
78 private int [] partsMinValue = { -1, -1, -1, negativeBitValue };
79 private int [] parts6 = { 1234, 5678, 8888, negativeScale4Value };
80 private NumberFormatInfo NfiUser;
82 private CultureInfo old_culture;
85 public void FixtureSetUp ()
87 old_culture = Thread.CurrentThread.CurrentCulture;
89 // Set culture to en-US and don't let the user override.
90 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US", false);
92 NfiUser = new NumberFormatInfo ();
93 NfiUser.CurrencyDecimalDigits = 3;
94 NfiUser.CurrencyDecimalSeparator = ",";
95 NfiUser.CurrencyGroupSeparator = "_";
96 NfiUser.CurrencyGroupSizes = new int [] { 2, 1, 0 };
97 NfiUser.CurrencyNegativePattern = 10;
98 NfiUser.CurrencyPositivePattern = 3;
99 NfiUser.CurrencySymbol = "XYZ";
100 NfiUser.NumberDecimalSeparator = "##";
101 NfiUser.NumberDecimalDigits = 4;
102 NfiUser.NumberGroupSeparator = "__";
103 NfiUser.NumberGroupSizes = new int [] { 2, 1 };
104 NfiUser.PercentDecimalDigits = 1;
105 NfiUser.PercentDecimalSeparator = ";";
106 NfiUser.PercentGroupSeparator = "~";
107 NfiUser.PercentGroupSizes = new int [] { 1 };
108 NfiUser.PercentNegativePattern = 2;
109 NfiUser.PercentPositivePattern = 2;
110 NfiUser.PercentSymbol = "%%%";
113 [TestFixtureTearDown]
114 public void FixtureTearDown ()
116 Thread.CurrentThread.CurrentCulture = old_culture;
120 public void TestToString ()
122 ToStringTest [] tab = {
123 new ToStringTest ("F", 12.345678m, "12.35"),
124 new ToStringTest ("F3", 12.345678m, "12.346"),
125 new ToStringTest ("F0", 12.345678m, "12"),
126 new ToStringTest ("F7", 12.345678m, "12.3456780"),
127 new ToStringTest ("g", 12.345678m, "12.345678"),
128 new ToStringTest ("E", 12.345678m, "1.234568E+001"),
129 new ToStringTest ("E3", 12.345678m, "1.235E+001"),
130 new ToStringTest ("E0", 12.345678m, "1E+001"),
131 new ToStringTest ("e8", 12.345678m, "1.23456780e+001"),
132 new ToStringTest ("F", 0.0012m, "0.00"),
133 new ToStringTest ("F3", 0.0012m, "0.001"),
134 new ToStringTest ("F0", 0.0012m, "0"),
135 new ToStringTest ("F6", 0.0012m, "0.001200"),
136 new ToStringTest ("e", 0.0012m, "1.200000e-003"),
137 new ToStringTest ("E3", 0.0012m, "1.200E-003"),
138 new ToStringTest ("E0", 0.0012m, "1E-003"),
139 new ToStringTest ("E6", 0.0012m, "1.200000E-003"),
140 new ToStringTest ("F4", -0.001234m, "-0.0012"),
141 new ToStringTest ("E3", -0.001234m, "-1.234E-003"),
142 new ToStringTest ("g", -0.000012m, "-0.000012"),
143 new ToStringTest ("g0", -0.000012m, "-1.2e-05"),
144 new ToStringTest ("g2", -0.000012m, "-1.2e-05"),
145 new ToStringTest ("g20", -0.000012m, "-1.2e-05"),
146 new ToStringTest ("g", -0.00012m, "-0.00012"),
147 new ToStringTest ("g4", -0.00012m, "-0.00012"),
148 new ToStringTest ("g7", -0.00012m, "-0.00012"),
149 new ToStringTest ("g", -0.0001234m, "-0.0001234"),
150 new ToStringTest ("g", -0.0012m, "-0.0012"),
151 new ToStringTest ("g", -0.001234m, "-0.001234"),
152 new ToStringTest ("g", -0.012m, "-0.012"),
153 new ToStringTest ("g4", -0.012m, "-0.012"),
154 new ToStringTest ("g", -0.12m, "-0.12"),
155 new ToStringTest ("g", -1.2m, "-1.2"),
156 new ToStringTest ("g4", -120m, "-120"),
157 new ToStringTest ("g", -12.000m, "-12.000"),
158 new ToStringTest ("g0", -12.000m, "-12"),
159 new ToStringTest ("g6", -12.000m, "-12"),
160 new ToStringTest ("g", -12m, "-12"),
161 new ToStringTest ("g", -120m, "-120"),
162 new ToStringTest ("g", -1200m, "-1200"),
163 new ToStringTest ("g4", -1200m, "-1200"),
164 new ToStringTest ("g", -1234m, "-1234"),
165 new ToStringTest ("g", -12000m, "-12000"),
166 new ToStringTest ("g4", -12000m, "-1.2e+04"),
167 new ToStringTest ("g5", -12000m, "-12000"),
168 new ToStringTest ("g", -12345m, "-12345"),
169 new ToStringTest ("g", -120000m, "-120000"),
170 new ToStringTest ("g4", -120000m, "-1.2e+05"),
171 new ToStringTest ("g5", -120000m, "-1.2e+05"),
172 new ToStringTest ("g6", -120000m, "-120000"),
173 new ToStringTest ("g", -123456.1m, "-123456.1"),
174 new ToStringTest ("g5", -123456.1m, "-1.2346e+05"),
175 new ToStringTest ("g6", -123456.1m, "-123456"),
176 new ToStringTest ("g", -1200000m, "-1200000"),
177 new ToStringTest ("g", -123456.1m, "-123456.1"),
178 new ToStringTest ("g", -123456.1m, "-123456.1"),
179 new ToStringTest ("g", -1234567.1m, "-1234567.1"),
180 new ToStringTest ("g", -12000000m, "-12000000"),
181 new ToStringTest ("g", -12345678.1m, "-12345678.1"),
182 new ToStringTest ("g", -12000000000000000000m, "-12000000000000000000"),
183 new ToStringTest ("F", -123, "-123.00"),
184 new ToStringTest ("F3", -123, "-123.000"),
185 new ToStringTest ("F0", -123, "-123"),
186 new ToStringTest ("E3", -123, "-1.230E+002"),
187 new ToStringTest ("E0", -123, "-1E+002"),
188 new ToStringTest ("E", -123, "-1.230000E+002"),
189 new ToStringTest ("F3", Decimal.MinValue, "-79228162514264337593543950335.000"),
190 new ToStringTest ("F", Decimal.MinValue, "-79228162514264337593543950335.00"),
191 new ToStringTest ("F0", Decimal.MinValue, "-79228162514264337593543950335"),
192 new ToStringTest ("E", Decimal.MinValue, "-7.922816E+028"),
193 new ToStringTest ("E3", Decimal.MinValue, "-7.923E+028"),
194 new ToStringTest ("E28", Decimal.MinValue, "-7.9228162514264337593543950335E+028"),
195 #if !TARGET_JVM // TargetJvmNotWorking
196 new ToStringTest ("E30", Decimal.MinValue, "-7.922816251426433759354395033500E+028"),
198 new ToStringTest ("E0", Decimal.MinValue, "-8E+028"),
199 new ToStringTest ("N3", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.000"),
200 new ToStringTest ("N0", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335"),
201 new ToStringTest ("N", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.00"),
202 new ToStringTest ("n3", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.000"),
203 new ToStringTest ("n0", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335"),
204 new ToStringTest ("n", Decimal.MinValue, "-79,228,162,514,264,337,593,543,950,335.00"),
205 new ToStringTest ("C", 123456.7890m, NumberFormatInfo.InvariantInfo.CurrencySymbol + "123,456.79"),
206 new ToStringTest ("C", -123456.7890m, "(" + NumberFormatInfo.InvariantInfo.CurrencySymbol + "123,456.79)"),
207 new ToStringTest ("C3", 1123456.7890m, NumberFormatInfo.InvariantInfo.CurrencySymbol + "1,123,456.789"),
208 new ToStringTest ("P", 123456.7891m, "12,345,678.91 %"),
209 new ToStringTest ("P", -123456.7892m, "-12,345,678.92 %"),
210 new ToStringTest ("P3", 1234.56789m, "123,456.789 %"),
213 NumberFormatInfo nfi = NumberFormatInfo.InvariantInfo;
215 for (int i = 0; i < tab.Length; i++) {
217 string s = tab [i].d.ToString (tab [i].format, nfi);
218 AssertEquals ("A01 tab[" + i + "].format = '" + tab [i].format + "')", tab [i].str, s);
219 } catch (OverflowException) {
220 Fail (tab [i].d.ToString (tab [i].format, nfi) + " (format = '" + tab [i].format + "'): unexpected exception !");
221 } catch (NUnit.Framework.AssertionException e) {
223 } catch (Exception e) {
224 Fail ("Unexpected Exception when i = " + i + ". e = " + e);
230 public void TestCurrencyPattern ()
232 NumberFormatInfo nfi2 = (NumberFormatInfo) NfiUser.Clone ();
233 Decimal d = -1234567.8976m;
234 string [] ergCurrencyNegativePattern = new String [16] {
235 "(XYZ1234_5_67,898)", "-XYZ1234_5_67,898", "XYZ-1234_5_67,898", "XYZ1234_5_67,898-",
236 "(1234_5_67,898XYZ)", "-1234_5_67,898XYZ", "1234_5_67,898-XYZ", "1234_5_67,898XYZ-",
237 "-1234_5_67,898 XYZ", "-XYZ 1234_5_67,898", "1234_5_67,898 XYZ-", "XYZ 1234_5_67,898-",
238 "XYZ -1234_5_67,898", "1234_5_67,898- XYZ", "(XYZ 1234_5_67,898)", "(1234_5_67,898 XYZ)",
241 for (int i = 0; i < ergCurrencyNegativePattern.Length; i++) {
242 nfi2.CurrencyNegativePattern = i;
243 if (d.ToString ("C", nfi2) != ergCurrencyNegativePattern [i]) {
244 Fail ("CurrencyNegativePattern #" + i + " failed: " +
245 d.ToString ("C", nfi2) + " != " + ergCurrencyNegativePattern [i]);
250 string [] ergCurrencyPositivePattern = new String [4] {
251 "XYZ1234_5_67,898", "1234_5_67,898XYZ", "XYZ 1234_5_67,898", "1234_5_67,898 XYZ",
254 for (int i = 0; i < ergCurrencyPositivePattern.Length; i++) {
255 nfi2.CurrencyPositivePattern = i;
256 if (d.ToString ("C", nfi2) != ergCurrencyPositivePattern [i]) {
257 Fail ("CurrencyPositivePattern #" + i + " failed: " +
258 d.ToString ("C", nfi2) + " != " + ergCurrencyPositivePattern [i]);
264 public void TestNumberNegativePattern ()
266 NumberFormatInfo nfi2 = (NumberFormatInfo) NfiUser.Clone ();
267 Decimal d = -1234.89765m;
268 string [] ergNumberNegativePattern = new String [5] {
269 "(1__2__34##8977)", "-1__2__34##8977", "- 1__2__34##8977", "1__2__34##8977-", "1__2__34##8977 -",
272 for (int i = 0; i < ergNumberNegativePattern.Length; i++) {
273 nfi2.NumberNegativePattern = i;
274 AssertEquals ("NumberNegativePattern #" + i, ergNumberNegativePattern [i], d.ToString ("N", nfi2));
279 [Category ("TargetJvmNotWorking")]
280 public void TestPercentPattern ()
282 NumberFormatInfo nfi2 = (NumberFormatInfo) NfiUser.Clone ();
283 Decimal d = -1234.8976m;
284 string [] ergPercentNegativePattern = new String [3] {
285 "-1~2~3~4~8~9;8 %%%", "-1~2~3~4~8~9;8%%%", "-%%%1~2~3~4~8~9;8"
288 for (int i = 0; i < ergPercentNegativePattern.Length; i++) {
289 nfi2.PercentNegativePattern = i;
290 if (d.ToString ("P", nfi2) != ergPercentNegativePattern [i]) {
291 Fail ("PercentNegativePattern #" + i + " failed: " +
292 d.ToString ("P", nfi2) + " != " + ergPercentNegativePattern [i]);
297 string [] ergPercentPositivePattern = new String [3] {
298 "1~2~3~4~8~9;8 %%%", "1~2~3~4~8~9;8%%%", "%%%1~2~3~4~8~9;8"
301 for (int i = 0; i < ergPercentPositivePattern.Length; i++) {
302 nfi2.PercentPositivePattern = i;
303 if (d.ToString ("P", nfi2) != ergPercentPositivePattern [i]) {
304 Fail ("PercentPositivePattern #" + i + " failed: " +
305 d.ToString ("P", nfi2) + " != " + ergPercentPositivePattern [i]);
311 new ParseTest("1.2345", 1.2345m),
312 new ParseTest("-9876543210", -9876543210m),
313 new ParseTest(NumberFormatInfo.InvariantInfo.CurrencySymbol
314 + " ( 79,228,162,514,264,337,593,543,950,335.000 ) ",
315 Decimal.MinValue, NumberStyles.Currency),
316 new ParseTest("1.234567890e-10", (Decimal)1.234567890e-10, NumberStyles.Float),
317 new ParseTest("1.234567890e-24", 1.2346e-24m, NumberStyles.Float),
318 new ParseTest(" 47896396.457983645462346E10 ", 478963964579836454.62346m, NumberStyles.Float),
319 new ParseTest("-7922816251426433759354395033.250000000000001", -7922816251426433759354395033.3m),
320 new ParseTest("-00000000000000795033.2500000000000000", -795033.25m),
321 new ParseTest("-000000000000001922816251426433759354395033.300000000000000", -1922816251426433759354395033.3m),
322 new ParseTest("-7922816251426433759354395033.150000000000", -7922816251426433759354395033.2m),
323 new ParseTest("-7922816251426433759354395033.2400000000000", -7922816251426433759354395033.2m),
324 new ParseTest("-7922816251426433759354395033.2600000000000", -7922816251426433759354395033.3m)
328 [Category ("TargetJvmNotWorking")]
329 public void TestParse ()
333 for (int i = 0; i < tab.Length; i++) {
335 d = Decimal.Parse (tab [i].str, tab [i].style, NumberFormatInfo.InvariantInfo);
336 if (tab [i].exceptionFlag) {
337 Fail (tab [i].str + ": missing exception !");
338 } else if (d != tab [i].d) {
339 Fail (tab [i].str + " != " + d);
341 } catch (OverflowException) {
342 if (!tab [i].exceptionFlag) {
343 Fail (tab [i].str + ": unexpected exception !");
349 d = Decimal.Parse (null);
350 Fail ("Expected ArgumentNullException");
351 } catch (ArgumentNullException) {
356 d = Decimal.Parse ("123nx");
357 Fail ("Expected FormatException");
358 } catch (FormatException) {
363 d = Decimal.Parse ("79228162514264337593543950336");
364 Fail ("Expected OverflowException" + d);
365 } catch (OverflowException) {
371 public void TestConstants ()
373 AssertEquals ("Zero", 0m, Decimal.Zero);
374 AssertEquals ("One", 1m, Decimal.One);
375 AssertEquals ("MinusOne", -1m, Decimal.MinusOne);
376 AssertEquals ("MaxValue", 79228162514264337593543950335m, Decimal.MaxValue);
377 AssertEquals ("MinValue", -79228162514264337593543950335m, Decimal.MinValue);
378 Assert ("MinusOne 2", -1m == Decimal.MinusOne);
382 public void TestConstructInt32 ()
384 decimal [] dtab = { 0m, 1m, -1m, 123456m, -1234567m };
385 int [] itab = { 0, 1, -1, 123456, -1234567 };
389 for (int i = 0; i < dtab.GetLength (0); i++) {
390 d = new Decimal (itab [i]);
391 if ((decimal) d != dtab [i]) {
392 Fail ("Int32 -> Decimal: " + itab [i] + " != " + d);
396 Fail ("Decimal -> Int32: " + d + " != " + itab [i]);
401 d = new Decimal (Int32.MaxValue);
402 Assert ((int) d == Int32.MaxValue);
404 d = new Decimal (Int32.MinValue);
405 Assert ((int) d == Int32.MinValue);
409 public void TestConstructUInt32 ()
411 decimal [] dtab = { 0m, 1m, 123456m, 123456789m };
412 uint [] itab = { 0, 1, 123456, 123456789 };
416 for (int i = 0; i < dtab.GetLength (0); i++) {
417 d = new Decimal (itab [i]);
418 if ((decimal) d != dtab [i]) {
419 Fail ("UInt32 -> Decimal: " + itab [i] + " != " + d);
423 Fail ("Decimal -> UInt32: " + d + " != " + itab [i]);
428 d = new Decimal (UInt32.MaxValue);
429 Assert ((uint) d == UInt32.MaxValue);
431 d = new Decimal (UInt32.MinValue);
432 Assert ((uint) d == UInt32.MinValue);
436 public void TestConstructInt64 ()
438 decimal [] dtab = { 0m, 1m, -1m, 9876543m, -9876543210m, 12345678987654321m };
439 long [] itab = { 0, 1, -1, 9876543, -9876543210L, 12345678987654321L };
443 for (int i = 0; i < dtab.GetLength (0); i++) {
444 d = new Decimal (itab [i]);
445 if ((decimal) d != dtab [i]) {
446 Fail ("Int64 -> Decimal: " + itab [i] + " != " + d);
450 Fail ("Decimal -> Int64: " + d + " != " + itab [i]);
455 d = new Decimal (Int64.MaxValue);
456 Assert ((long) d == Int64.MaxValue);
458 d = new Decimal (Int64.MinValue);
459 Assert ((long) d == Int64.MinValue);
463 public void TestConstructUInt64 ()
465 decimal [] dtab = { 0m, 1m, 987654321m, 123456789876543210m };
466 ulong [] itab = { 0, 1, 987654321, 123456789876543210L };
470 for (int i = 0; i < dtab.GetLength (0); i++) {
471 d = new Decimal (itab [i]);
472 if ((decimal) d != dtab [i]) {
473 Fail ("UInt64 -> Decimal: " + itab [i] + " != " + d);
477 Fail ("Decimal -> UInt64: " + d + " != " + itab [i]);
482 d = new Decimal (UInt64.MaxValue);
483 Assert ((ulong) d == UInt64.MaxValue);
485 d = new Decimal (UInt64.MinValue);
486 Assert ((ulong) d == UInt64.MinValue);
490 public void TestConstructSingle ()
494 d = new Decimal (-1.2345678f);
495 AssertEquals ("A#01", -1.234568m, (decimal) d);
498 AssertEquals ("A#02", 3.0f, (float) d);
500 d = new Decimal (0.0f);
501 AssertEquals ("A#03", 0m, (decimal) d);
502 AssertEquals ("A#04", 0.0f, (float) d);
504 d = new Decimal (1.0f);
505 AssertEquals ("A#05", 1m, (decimal) d);
506 AssertEquals ("A#06", 1.0f, (float) d);
508 d = new Decimal (-1.2345678f);
509 AssertEquals ("A#07", -1.234568m, (decimal) d);
510 AssertEquals ("A#08", -1.234568f, (float) d);
512 d = new Decimal (1.2345673f);
513 AssertEquals ("A#09", 1.234567m, (decimal) d);
515 d = new Decimal (1.2345673e7f);
516 AssertEquals ("A#10", 12345670m, (decimal) d);
518 d = new Decimal (1.2345673e-17f);
519 AssertEquals ("A#11", 0.00000000000000001234567m, (decimal) d);
520 AssertEquals ("A#12", 1.234567e-17f, (float) d);
524 d = new Decimal (Single.MaxValue);
526 } catch (OverflowException) {
530 d = new Decimal (Single.NaN);
532 } catch (OverflowException) {
536 d = new Decimal (Single.PositiveInfinity);
538 } catch (OverflowException) {
543 public void TestConstructSingleRounding_NowWorking ()
547 d = new Decimal (1765.23454f);
548 AssertEquals ("failed banker's rule rounding test 2", 1765.234m, d);
550 d = new Decimal (0.00017652356f);
551 AssertEquals ("06", 0.0001765236m, d);
553 d = new Decimal (0.000176523554f);
554 AssertEquals ("failed banker's rule rounding test 3", 0.0001765236m, d);
556 d = new Decimal (0.00017652354f);
557 AssertEquals ("08", 0.0001765235m, d);
559 d = new Decimal (0.00017652346f);
560 AssertEquals ("09", 0.0001765235m, d);
562 d = new Decimal (0.000176523454f);
563 AssertEquals ("failed banker's rule rounding test 4", 0.0001765234m, d);
565 d = new Decimal (0.00017652344f);
566 AssertEquals ("11", 0.0001765234m, d);
569 public void TestConstructSingleRounding ()
573 d = new Decimal (1765.2356f);
574 Assert ("01", d == 1765.236m);
576 d = new Decimal (1765.23554f);
577 Assert ("failed banker's rule rounding test 1", d == 1765.236m);
579 d = new Decimal (1765.2354f);
580 Assert ("03", d == 1765.235m);
582 d = new Decimal (1765.2346f);
583 Assert ("04", d == 1765.235m);
585 d = new Decimal (1765.2344f);
586 Assert ("05", d == 1765.234m);
588 d = new Decimal (3.7652356e10f);
589 Assert ("12", d == 37652360000m);
591 d = new Decimal (3.7652356e20f);
592 Assert ("13", d == 376523600000000000000m);
594 d = new Decimal (3.76523554e20f);
595 Assert ("failed banker's rule rounding test 5", d == 376523600000000000000m);
597 d = new Decimal (3.7652352e20f);
598 Assert ("15", d == 376523500000000000000m);
600 d = new Decimal (3.7652348e20f);
601 Assert ("16", d == 376523500000000000000m);
603 d = new Decimal (3.76523454e20f);
604 Assert ("failed banker's rule rounding test 6", d == 376523400000000000000m);
606 d = new Decimal (3.7652342e20f);
607 Assert ("18", d == 376523400000000000000m);
611 public void TestConstructDouble ()
615 d = new Decimal (0.0);
616 Assert ((decimal) d == 0m);
618 d = new Decimal (1.0);
619 Assert ((decimal) d == 1m);
620 Assert (1.0 == (double) d);
622 d = new Decimal (-1.2345678901234);
623 Assert ((decimal) d == -1.2345678901234m);
624 Assert (-1.2345678901234 == (double) d);
626 d = new Decimal (1.2345678901234);
627 Assert ((decimal) d == 1.2345678901234m);
629 d = new Decimal (1.2345678901234e8);
630 Assert ((decimal) d == 123456789.01234m);
631 Assert (1.2345678901234e8 == (double) d);
633 d = new Decimal (1.2345678901234e16);
634 Assert ((decimal) d == 12345678901234000m);
635 Assert (1.2345678901234e16 == (double) d);
637 d = new Decimal (1.2345678901234e24);
638 Assert ((decimal) d == 1234567890123400000000000m);
639 Assert (1.2345678901234e24 == (double) d);
641 d = new Decimal (1.2345678901234e28);
642 Assert ((decimal) d == 1.2345678901234e28m);
643 Assert (1.2345678901234e28 == (double) d);
645 d = new Decimal (7.2345678901234e28);
646 Assert ((decimal) d == 7.2345678901234e28m);
647 Assert (new Decimal ((double) d) == d);
649 d = new Decimal (1.2345678901234e-8);
650 Assert ((decimal) d == 1.2345678901234e-8m);
652 d = new Decimal (1.2345678901234e-14);
653 Assert ((decimal) d == 1.2345678901234e-14m);
654 Assert (1.2345678901234e-14 == (double) d);
656 d = new Decimal (1.2342278901234e-25);
657 AssertEquals ("A10", d, 1.234e-25m);
661 d = new Decimal (8e28);
663 } catch (OverflowException) {
667 d = new Decimal (8e48);
669 } catch (OverflowException) {
673 d = new Decimal (Double.NaN);
675 } catch (OverflowException) {
679 d = new Decimal (Double.PositiveInfinity);
681 } catch (OverflowException) {
686 public void TestConstructDoubleRound ()
692 d = new Decimal (1765.231234567857);
693 AssertEquals ("A01", 1765.23123456786m, d);
696 d = new Decimal (1765.2312345678554);
697 AssertEquals ("A02, failed banker's rule rounding test 1", 1765.23123456786m, d);
698 AssertEquals ("A03", 1765.23123456786, (double) d);
701 d = new Decimal (1765.231234567853);
702 Assert (d == 1765.23123456785m);
705 d = new Decimal (1765.231234567847);
706 Assert (d == 1765.23123456785m);
709 d = new Decimal (1765.231234567843);
710 Assert (d == 1765.23123456784m);
713 d = new Decimal (1.765231234567857e-9);
714 Assert (d == 1.76523123456786e-9m);
717 d = new Decimal (1.7652312345678554e-9);
718 Assert ("failed banker's rule rounding test 3", d == 1.76523123456786e-9m);
721 d = new Decimal (1.765231234567853e-9);
722 Assert (d == 1.76523123456785e-9m);
725 d = new Decimal (1.765231234567857e+24);
726 Assert (d == 1.76523123456786e+24m);
729 d = new Decimal (1.7652312345678554e+24);
730 Assert ("failed banker's rule rounding test 4", d == 1.76523123456786e+24m);
733 d = new Decimal (1.765231234567853e+24);
734 Assert (d == 1.76523123456785e+24m);
737 d = new Decimal (1765.2312345678454);
738 Assert (d == 1765.23123456785m);
739 } catch (Exception e) {
740 Fail ("At TestNum = " + TestNum + " unexpected exception. e = " + e);
745 public void TestNegate ()
749 d = new Decimal (12345678);
750 Assert ((decimal) Decimal.Negate (d) == -12345678m);
754 public void TestPartConstruct ()
758 d = new Decimal (parts0);
761 d = new Decimal (parts1);
764 d = new Decimal (parts2);
765 Assert (d == 4294967296m);
767 d = new Decimal (parts3);
768 Assert (d == 18446744073709551616m);
770 d = new Decimal (parts4);
773 d = new Decimal (parts5);
774 Assert (d == 18446744078004518913m);
776 d = new Decimal (partsMaxValue);
777 Assert (d == Decimal.MaxValue);
779 d = new Decimal (partsMinValue);
780 Assert (d == Decimal.MinValue);
782 d = new Decimal (parts6);
783 int [] erg = Decimal.GetBits (d);
784 for (int i = 0; i < 4; i++) {
785 Assert (erg [i] == parts6 [i]);
790 public void TestFloorTruncate ()
793 {0m, 0m, 0m}, {1m, 1m, 1m}, {-1m, -1m, -1m}, {1.1m, 1m, 1m},
794 {-1.000000000001m, -2m, -1m}, {12345.67890m,12345m,12345m},
795 {-123456789012345.67890m, -123456789012346m, -123456789012345m},
796 {Decimal.MaxValue, Decimal.MaxValue, Decimal.MaxValue},
797 {Decimal.MinValue, Decimal.MinValue, Decimal.MinValue},
798 {6.999999999m, 6m, 6m}, {-6.999999999m, -7m, -6m},
799 {0.00001m, 0m, 0m}, {-0.00001m, -1m, 0m}
804 for (int i = 0; i < dtab.GetLength (0); i++) {
805 d = Decimal.Floor (dtab [i, 0]);
806 if (d != dtab [i, 1]) {
807 Fail ("Floor: Floor(" + dtab [i, 0] + ") != " + d);
809 d = Decimal.Truncate (dtab [i, 0]);
810 if (d != dtab [i, 2]) {
811 Fail ("Truncate: Truncate(" + dtab [i, 0] + ") != " + d);
817 public void Truncate ()
820 decimal dt = Decimal.Truncate (dd);
821 AssertEquals ("Original", 249.9m, dd);
822 AssertEquals ("Truncate", 249m, dt);
823 AssertEquals ("Cast-Byte", 249, (byte) dd);
824 AssertEquals ("Cast-Char", 249, (char) dd);
825 AssertEquals ("Cast-Int16", 249, (short) dd);
826 AssertEquals ("Cast-UInt16", 249, (ushort) dd);
827 AssertEquals ("Cast-Int32", 249, (int) dd);
828 AssertEquals ("Cast-UInt32", 249, (uint) dd);
829 AssertEquals ("Cast-Int64", 249, (long) dd);
830 AssertEquals ("Cast-UInt64", 249, (ulong) dd);
834 public void TestRound ()
837 {1m, 0, 1m}, {1.234567890m, 1, 1.2m},
838 {1.234567890m, 2, 1.23m}, {1.23450000001m, 3, 1.235m},
839 {1.2355m, 3, 1.236m},
840 {1.234567890m, 4, 1.2346m}, {1.23567890m, 2, 1.24m},
841 {47893764694.4578563236436621m, 7, 47893764694.4578563m},
842 {-47893764694.4578563236436621m, 9, -47893764694.457856324m},
843 {-47893764694.4578m, 5, -47893764694.4578m}
848 for (int i = 0; i < dtab.GetLength (0); i++) {
849 d = Decimal.Round (dtab [i, 0], (int) dtab [i, 1]);
850 if (d != dtab [i, 2]) {
851 Fail ("Round: Round(" + dtab [i, 0] + "," + (int) dtab [i, 1] + ") != " + d);
857 public void TestRoundFailures ()
865 for (int i = 0; i < dtab.GetLength (0); i++) {
866 d = Decimal.Round (dtab [i, 0], (int) dtab [i, 1]);
867 if (d != dtab [i, 2]) {
868 Fail ("FailRound: Round(" + dtab [i, 0] + "," + (int) dtab [i, 1] + ") != " + d);
874 public void ParseInt64 ()
876 long max = Int64.MaxValue;
877 Decimal dmax = Decimal.Parse (max.ToString ());
878 AssertEquals ("Int64.MaxValue", Int64.MaxValue, Decimal.ToInt64 (dmax));
880 long min = Int64.MinValue;
881 Decimal dmin = Decimal.Parse (min.ToString ());
882 AssertEquals ("Int64.MinValue", Int64.MinValue, Decimal.ToInt64 (dmin));
885 dmax = Decimal.Parse (dmax.ToString ());
886 AssertEquals ("Int64.MaxValue+1.1", Int64.MaxValue, Decimal.ToInt64 (dmax - 1.1m));
889 dmin = Decimal.Parse (dmin.ToString ());
890 AssertEquals ("Int64.MinValue-1.1", Int64.MinValue, Decimal.ToInt64 (dmin + 1.1m));
894 public void ToByte ()
897 AssertEquals ("Decimal.ToByte", 254, Decimal.ToByte (d));
898 AssertEquals ("Convert.ToByte", 255, Convert.ToByte (d));
899 AssertEquals ("IConvertible.ToByte", 255, (d as IConvertible).ToByte (null));
903 public void ToSByte ()
906 AssertEquals ("Decimal.ToSByte", 126, Decimal.ToSByte (d));
907 AssertEquals ("Convert.ToSByte", 127, Convert.ToSByte (d));
908 AssertEquals ("IConvertible.ToSByte", 127, (d as IConvertible).ToSByte (null));
910 AssertEquals ("-Decimal.ToSByte", -126, Decimal.ToSByte (d));
911 AssertEquals ("-Convert.ToSByte", -127, Convert.ToSByte (d));
912 AssertEquals ("-IConvertible.ToSByte", -127, (d as IConvertible).ToSByte (null));
916 public void ToInt16 ()
919 AssertEquals ("Decimal.ToInt16", 254, Decimal.ToInt16 (d));
920 AssertEquals ("Convert.ToInt16", 255, Convert.ToInt16 (d));
921 AssertEquals ("IConvertible.ToInt16", 255, (d as IConvertible).ToInt16 (null));
923 AssertEquals ("-Decimal.ToInt16", -254, Decimal.ToInt16 (d));
924 AssertEquals ("-Convert.ToInt16", -255, Convert.ToInt16 (d));
925 AssertEquals ("-IConvertible.ToInt16", -255, (d as IConvertible).ToInt16 (null));
929 public void ToUInt16 ()
932 AssertEquals ("Decimal.ToUInt16", 254, Decimal.ToUInt16 (d));
933 AssertEquals ("Convert.ToUInt16", 255, Convert.ToUInt16 (d));
934 AssertEquals ("IConvertible.ToUInt16", 255, (d as IConvertible).ToUInt16 (null));
938 public void ToInt32 ()
941 AssertEquals ("Decimal.ToInt32", 254, Decimal.ToInt32 (d));
942 AssertEquals ("Convert.ToInt32", 255, Convert.ToInt32 (d));
943 AssertEquals ("IConvertible.ToInt32", 255, (d as IConvertible).ToInt32 (null));
945 AssertEquals ("-Decimal.ToInt32", -254, Decimal.ToInt32 (d));
946 AssertEquals ("-Convert.ToInt32", -255, Convert.ToInt32 (d));
947 AssertEquals ("-IConvertible.ToInt32", -255, (d as IConvertible).ToInt32 (null));
951 public void ToUInt32 ()
954 AssertEquals ("Decimal.ToUInt32", 254, Decimal.ToUInt32 (d));
955 AssertEquals ("Convert.ToUInt32", 255, Convert.ToUInt32 (d));
956 AssertEquals ("IConvertible.ToUInt32", 255, (d as IConvertible).ToUInt32 (null));
960 public void ToInt64 ()
963 AssertEquals ("Decimal.ToInt64", 254, Decimal.ToInt64 (d));
964 AssertEquals ("Convert.ToInt64", 255, Convert.ToInt64 (d));
965 AssertEquals ("IConvertible.ToInt64", 255, (d as IConvertible).ToInt64 (null));
967 AssertEquals ("-Decimal.ToInt64", -254, Decimal.ToInt64 (d));
968 AssertEquals ("-Convert.ToInt64", -255, Convert.ToInt64 (d));
969 AssertEquals ("-IConvertible.ToInt64", -255, (d as IConvertible).ToInt64 (null));
973 [ExpectedException (typeof (OverflowException))]
974 public void ToInt64_TooBig ()
976 Decimal d = (Decimal) Int64.MaxValue;
978 long value = Decimal.ToInt64 (d);
982 [ExpectedException (typeof (OverflowException))]
983 public void ToInt64_TooSmall ()
985 Decimal d = (Decimal) Int64.MinValue;
987 long value = Decimal.ToInt64 (d);
991 public void ToUInt64 ()
994 AssertEquals ("Decimal.ToUInt64", 254, Decimal.ToUInt64 (d));
995 AssertEquals ("Convert.ToUInt64", 255, Convert.ToUInt64 (d));
996 AssertEquals ("IConvertible.ToUInt64", 255, (d as IConvertible).ToUInt64 (null));
1000 public void ToSingle ()
1003 AssertEquals ("Decimal.ToSingle", 254.9f, Decimal.ToSingle (d));
1004 AssertEquals ("Convert.ToSingle", 254.9f, Convert.ToSingle (d));
1005 AssertEquals ("IConvertible.ToSingle", 254.9f, (d as IConvertible).ToSingle (null));
1007 AssertEquals ("-Decimal.ToSingle", -254.9f, Decimal.ToSingle (d));
1008 AssertEquals ("-Convert.ToSingle", -254.9f, Convert.ToSingle (d));
1009 AssertEquals ("-IConvertible.ToSingle", -254.9f, (d as IConvertible).ToSingle (null));
1013 public void ToDouble ()
1016 AssertEquals ("Decimal.ToDouble", 254.9d, Decimal.ToDouble (d));
1017 AssertEquals ("Convert.ToDouble", 254.9d, Convert.ToDouble (d));
1018 AssertEquals ("IConvertible.ToDouble", 254.9d, (d as IConvertible).ToDouble (null));
1020 AssertEquals ("-Decimal.ToDouble", -254.9d, Decimal.ToDouble (d));
1021 AssertEquals ("-Convert.ToDouble", -254.9d, Convert.ToDouble (d));
1022 AssertEquals ("-IConvertible.ToDouble", -254.9d, (d as IConvertible).ToDouble (null));
1026 public void ToString_Defaults ()
1029 // everything defaults to "G"
1030 string def = d.ToString ("G");
1031 AssertEquals ("ToString()", def, d.ToString ());
1032 AssertEquals ("ToString((IFormatProvider)null)", def, d.ToString ((IFormatProvider) null));
1033 AssertEquals ("ToString((string)null)", def, d.ToString ((string) null));
1034 AssertEquals ("ToString(empty)", def, d.ToString (String.Empty));
1035 AssertEquals ("ToString(null,null)", def, d.ToString (null, null));
1036 AssertEquals ("ToString(empty,null)", def, d.ToString (String.Empty, null));
1038 AssertEquals ("ToString()", "254.9", def);
1042 public void CastTruncRounding ()
1044 // casting truncs decimal value (not normal nor banker's rounding)
1045 AssertEquals ("254.9==254", 254, (long) (254.9m));
1046 AssertEquals ("-254.9=-254", -254, (long) (-254.9m));
1047 AssertEquals ("255.9==256", 255, (long) (255.9m));
1048 AssertEquals ("-255.9=-256", -255, (long) (-255.9m));
1052 public void ParseFractions ()
1054 decimal d1 = Decimal.Parse ("0.523456789012345467890123456789", CultureInfo.InvariantCulture);
1055 AssertEquals ("f1", 0.5234567890123454678901234568m, d1);
1056 decimal d2 = Decimal.Parse ("0.49214206543486529434634231456", CultureInfo.InvariantCulture);
1057 AssertEquals ("f2", 0.4921420654348652943463423146m, d2);
1061 [ExpectedException (typeof (OverflowException))]
1062 public void Parse_Int64_Overflow ()
1064 // Int64.MaxValue + 1 + small fraction to allow 30 digits
1065 // 123456789012345678901234567890
1066 decimal d = Decimal.Parse ("9223372036854775808.0000000009", CultureInfo.InvariantCulture);
1072 [Category ("TargetJvmNotWorking")]
1073 public void TryParse ()
1077 // These should return false
1078 AssertEquals (false, Decimal.TryParse ("79228162514264337593543950336", out r));
1079 AssertEquals (false, Decimal.TryParse ("123nx", NumberStyles.Number, CultureInfo.InvariantCulture, out r));
1080 AssertEquals (false, Decimal.TryParse (null, NumberStyles.Number, CultureInfo.InvariantCulture, out r));
1082 // These should pass
1083 for (int i = 0; i < tab.Length; i++) {
1084 AssertEquals (!tab [i].exceptionFlag,
1085 Decimal.TryParse (tab [i].str, tab [i].style,
1086 NumberFormatInfo.InvariantInfo, out r));
1092 [ExpectedException (typeof (DivideByZeroException))]
1093 public void Remainder_ByZero ()
1095 Decimal.Remainder (254.9m, 0m);
1099 public void Remainder ()
1101 decimal p1 = 254.9m;
1103 decimal n1 = -254.9m;
1104 decimal n2 = -12.1m;
1106 AssertEquals ("254.9 % 12.1", 0.8m, Decimal.Remainder (p1, p2));
1107 AssertEquals ("-254.9 % 12.1", -0.8m, Decimal.Remainder (n1, p2));
1108 AssertEquals ("254.9 % -12.1", 0.8m, Decimal.Remainder (p1, n2));
1109 AssertEquals ("-254.9 % -12.1", -0.8m, Decimal.Remainder (n1, n2));
1111 AssertEquals ("12.1 % 254.9", 12.1m, Decimal.Remainder (p2, p1));
1112 AssertEquals ("-12.1 % 254.9", -12.1m, Decimal.Remainder (n2, p1));
1113 AssertEquals ("12.1 % -254.9", 12.1m, Decimal.Remainder (p2, n1));
1114 AssertEquals ("-12.1 % -254.9", -12.1m, Decimal.Remainder (n2, n1));
1116 AssertEquals ("12.1 % 12.1", 0.0m, Decimal.Remainder (p1, p1));
1117 AssertEquals ("-12.1 % 12.1", 0.0m, Decimal.Remainder (n1, p1));
1118 AssertEquals ("12.1 % -12.1", 0.0m, Decimal.Remainder (p1, n1));
1119 AssertEquals ("-12.1 % -12.1", 0.0m, Decimal.Remainder (n1, n1));
1121 AssertEquals ("12.1 % 12.1", 0, Decimal.Remainder (p1, p1));
1122 AssertEquals ("-12.1 % 12.1", 0, Decimal.Remainder (n1, p1));
1123 AssertEquals ("12.1 % -12.1", 0, Decimal.Remainder (p1, n1));
1124 AssertEquals ("-12.1 % -12.1", 0, Decimal.Remainder (n1, n1));
1129 [ExpectedException (typeof (DivideByZeroException))]
1130 public void Divide_ByZero ()
1132 Decimal.Divide (254.9m, 0m);
1136 public void Divide ()
1138 decimal p1 = 254.9m;
1140 decimal n1 = -254.9m;
1141 decimal n2 = -12.1m;
1143 decimal c1 = 21.066115702479338842975206612m;
1144 decimal c2 = 0.0474695959199686151431934092m;
1146 AssertEquals ("254.9 / 12.1", c1, Decimal.Divide (p1, p2));
1147 AssertEquals ("-254.9 / 12.1", -c1, Decimal.Divide (n1, p2));
1148 AssertEquals ("254.9 / -12.1", -c1, Decimal.Divide (p1, n2));
1149 AssertEquals ("-254.9 / -12.1", c1, Decimal.Divide (n1, n2));
1151 AssertEquals ("12.1 / 254.9", c2, Decimal.Divide (p2, p1));
1152 AssertEquals ("-12.1 / 254.9", -c2, Decimal.Divide (n2, p1));
1153 AssertEquals ("12.1 / -254.9", -c2, Decimal.Divide (p2, n1));
1154 AssertEquals ("-12.1 / -254.9", c2, Decimal.Divide (n2, n1));
1156 AssertEquals ("12.1 / 12.1", 1, Decimal.Divide (p1, p1));
1157 AssertEquals ("-12.1 / 12.1", -1, Decimal.Divide (n1, p1));
1158 AssertEquals ("12.1 / -12.1", -1, Decimal.Divide (p1, n1));
1159 AssertEquals ("-12.1 / -12.1", 1, Decimal.Divide (n1, n1));
1163 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1164 public void Round_InvalidDecimals_Negative ()
1166 Decimal.Round (254.9m, -1);
1170 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1171 public void Round_InvalidDecimals_TooHigh ()
1173 Decimal.Round (254.9m, 29);
1177 public void Round_OddValue ()
1179 decimal five = 5.5555555555555555555555555555m;
1180 AssertEquals ("5,5_,00", 6, Decimal.Round (five, 0));
1181 AssertEquals ("5,5_,01", 5.6m, Decimal.Round (five, 1));
1182 AssertEquals ("5,5_,02", 5.56m, Decimal.Round (five, 2));
1183 AssertEquals ("5,5_,03", 5.556m, Decimal.Round (five, 3));
1184 AssertEquals ("5,5_,04", 5.5556m, Decimal.Round (five, 4));
1185 AssertEquals ("5,5_,05", 5.55556m, Decimal.Round (five, 5));
1186 AssertEquals ("5,5_,06", 5.555556m, Decimal.Round (five, 6));
1187 AssertEquals ("5,5_,07", 5.5555556m, Decimal.Round (five, 7));
1188 AssertEquals ("5,5_,08", 5.55555556m, Decimal.Round (five, 8));
1189 AssertEquals ("5,5_,09", 5.555555556m, Decimal.Round (five, 9));
1190 AssertEquals ("5,5_,10", 5.5555555556m, Decimal.Round (five, 10));
1191 AssertEquals ("5,5_,11", 5.55555555556m, Decimal.Round (five, 11));
1192 AssertEquals ("5,5_,12", 5.555555555556m, Decimal.Round (five, 12));
1193 AssertEquals ("5,5_,13", 5.5555555555556m, Decimal.Round (five, 13));
1194 AssertEquals ("5,5_,14", 5.55555555555556m, Decimal.Round (five, 14));
1195 AssertEquals ("5,5_,15", 5.555555555555556m, Decimal.Round (five, 15));
1196 AssertEquals ("5,5_,16", 5.5555555555555556m, Decimal.Round (five, 16));
1197 AssertEquals ("5,5_,17", 5.55555555555555556m, Decimal.Round (five, 17));
1198 AssertEquals ("5,5_,18", 5.555555555555555556m, Decimal.Round (five, 18));
1199 AssertEquals ("5,5_,19", 5.5555555555555555556m, Decimal.Round (five, 19));
1200 AssertEquals ("5,5_,20", 5.55555555555555555556m, Decimal.Round (five, 20));
1201 AssertEquals ("5,5_,21", 5.555555555555555555556m, Decimal.Round (five, 21));
1202 AssertEquals ("5,5_,22", 5.5555555555555555555556m, Decimal.Round (five, 22));
1203 AssertEquals ("5,5_,23", 5.55555555555555555555556m, Decimal.Round (five, 23));
1204 AssertEquals ("5,5_,24", 5.555555555555555555555556m, Decimal.Round (five, 24));
1205 AssertEquals ("5,5_,25", 5.5555555555555555555555556m, Decimal.Round (five, 25));
1206 AssertEquals ("5,5_,26", 5.55555555555555555555555556m, Decimal.Round (five, 26));
1207 AssertEquals ("5,5_,27", 5.555555555555555555555555556m, Decimal.Round (five, 27));
1208 AssertEquals ("5.5_,28", 5.5555555555555555555555555555m, Decimal.Round (five, 28));
1212 public void Round_EvenValue ()
1214 AssertEquals ("2,2_5,00", 2, Decimal.Round (2.5m, 0));
1215 AssertEquals ("2,2_5,01", 2.2m, Decimal.Round (2.25m, 1));
1216 AssertEquals ("2,2_5,02", 2.22m, Decimal.Round (2.225m, 2));
1217 AssertEquals ("2,2_5,03", 2.222m, Decimal.Round (2.2225m, 3));
1218 AssertEquals ("2,2_5,04", 2.2222m, Decimal.Round (2.22225m, 4));
1219 AssertEquals ("2,2_5,05", 2.22222m, Decimal.Round (2.222225m, 5));
1220 AssertEquals ("2,2_5,06", 2.222222m, Decimal.Round (2.2222225m, 6));
1221 AssertEquals ("2,2_5,07", 2.2222222m, Decimal.Round (2.22222225m, 7));
1222 AssertEquals ("2,2_5,08", 2.22222222m, Decimal.Round (2.222222225m, 8));
1223 AssertEquals ("2,2_5,09", 2.222222222m, Decimal.Round (2.2222222225m, 9));
1224 AssertEquals ("2,2_5,10", 2.2222222222m, Decimal.Round (2.22222222225m, 10));
1225 AssertEquals ("2,2_5,11", 2.22222222222m, Decimal.Round (2.222222222225m, 11));
1226 AssertEquals ("2,2_5,12", 2.222222222222m, Decimal.Round (2.2222222222225m, 12));
1227 AssertEquals ("2,2_5,13", 2.2222222222222m, Decimal.Round (2.22222222222225m, 13));
1228 AssertEquals ("2,2_5,14", 2.22222222222222m, Decimal.Round (2.222222222222225m, 14));
1229 AssertEquals ("2,2_5,15", 2.222222222222222m, Decimal.Round (2.2222222222222225m, 15));
1230 AssertEquals ("2,2_5,16", 2.2222222222222222m, Decimal.Round (2.22222222222222225m, 16));
1231 AssertEquals ("2,2_5,17", 2.22222222222222222m, Decimal.Round (2.222222222222222225m, 17));
1232 AssertEquals ("2,2_5,18", 2.222222222222222222m, Decimal.Round (2.2222222222222222225m, 18));
1233 AssertEquals ("2,2_5,19", 2.2222222222222222222m, Decimal.Round (2.22222222222222222225m, 19));
1234 AssertEquals ("2,2_5,20", 2.22222222222222222222m, Decimal.Round (2.222222222222222222225m, 20));
1235 AssertEquals ("2,2_5,21", 2.222222222222222222222m, Decimal.Round (2.2222222222222222222225m, 21));
1236 AssertEquals ("2,2_5,22", 2.2222222222222222222222m, Decimal.Round (2.22222222222222222222225m, 22));
1237 AssertEquals ("2,2_5,23", 2.22222222222222222222222m, Decimal.Round (2.222222222222222222222225m, 23));
1238 AssertEquals ("2,2_5,24", 2.222222222222222222222222m, Decimal.Round (2.2222222222222222222222225m, 24));
1239 AssertEquals ("2,2_5,25", 2.2222222222222222222222222m, Decimal.Round (2.22222222222222222222222225m, 25));
1240 AssertEquals ("2,2_5,26", 2.22222222222222222222222222m, Decimal.Round (2.222222222222222222222222225m, 26));
1241 AssertEquals ("2,2_5,27", 2.222222222222222222222222222m, Decimal.Round (2.2222222222222222222222222225m, 27));
1242 AssertEquals ("2,2_5,28", 2.2222222222222222222222222222m, Decimal.Round (2.22222222222222222222222222225m, 28));
1246 public void Round_OddValue_Negative ()
1248 decimal five = -5.5555555555555555555555555555m;
1249 AssertEquals ("-5,5_,00", -6, Decimal.Round (five, 0));
1250 AssertEquals ("-5,5_,01", -5.6m, Decimal.Round (five, 1));
1251 AssertEquals ("-5,5_,02", -5.56m, Decimal.Round (five, 2));
1252 AssertEquals ("-5,5_,03", -5.556m, Decimal.Round (five, 3));
1253 AssertEquals ("-5,5_,04", -5.5556m, Decimal.Round (five, 4));
1254 AssertEquals ("-5,5_,05", -5.55556m, Decimal.Round (five, 5));
1255 AssertEquals ("-5,5_,06", -5.555556m, Decimal.Round (five, 6));
1256 AssertEquals ("-5,5_,07", -5.5555556m, Decimal.Round (five, 7));
1257 AssertEquals ("-5,5_,08", -5.55555556m, Decimal.Round (five, 8));
1258 AssertEquals ("-5,5_,09", -5.555555556m, Decimal.Round (five, 9));
1259 AssertEquals ("-5,5_,10", -5.5555555556m, Decimal.Round (five, 10));
1260 AssertEquals ("-5,5_,11", -5.55555555556m, Decimal.Round (five, 11));
1261 AssertEquals ("-5,5_,12", -5.555555555556m, Decimal.Round (five, 12));
1262 AssertEquals ("-5,5_,13", -5.5555555555556m, Decimal.Round (five, 13));
1263 AssertEquals ("-5,5_,14", -5.55555555555556m, Decimal.Round (five, 14));
1264 AssertEquals ("-5,5_,15", -5.555555555555556m, Decimal.Round (five, 15));
1265 AssertEquals ("-5,5_,16", -5.5555555555555556m, Decimal.Round (five, 16));
1266 AssertEquals ("-5,5_,17", -5.55555555555555556m, Decimal.Round (five, 17));
1267 AssertEquals ("-5,5_,18", -5.555555555555555556m, Decimal.Round (five, 18));
1268 AssertEquals ("-5,5_,19", -5.5555555555555555556m, Decimal.Round (five, 19));
1269 AssertEquals ("-5,5_,20", -5.55555555555555555556m, Decimal.Round (five, 20));
1270 AssertEquals ("-5,5_,21", -5.555555555555555555556m, Decimal.Round (five, 21));
1271 AssertEquals ("-5,5_,22", -5.5555555555555555555556m, Decimal.Round (five, 22));
1272 AssertEquals ("-5,5_,23", -5.55555555555555555555556m, Decimal.Round (five, 23));
1273 AssertEquals ("-5,5_,24", -5.555555555555555555555556m, Decimal.Round (five, 24));
1274 AssertEquals ("-5,5_,25", -5.5555555555555555555555556m, Decimal.Round (five, 25));
1275 AssertEquals ("-5,5_,26", -5.55555555555555555555555556m, Decimal.Round (five, 26));
1276 AssertEquals ("-5,5_,27", -5.555555555555555555555555556m, Decimal.Round (five, 27));
1277 AssertEquals ("-5.5_,28", -5.5555555555555555555555555555m, Decimal.Round (five, 28));
1281 public void Round_EvenValue_Negative ()
1283 AssertEquals ("-2,2_5,00", -2, Decimal.Round (-2.5m, 0));
1284 AssertEquals ("-2,2_5,01", -2.2m, Decimal.Round (-2.25m, 1));
1285 AssertEquals ("-2,2_5,02", -2.22m, Decimal.Round (-2.225m, 2));
1286 AssertEquals ("-2,2_5,03", -2.222m, Decimal.Round (-2.2225m, 3));
1287 AssertEquals ("-2,2_5,04", -2.2222m, Decimal.Round (-2.22225m, 4));
1288 AssertEquals ("-2,2_5,05", -2.22222m, Decimal.Round (-2.222225m, 5));
1289 AssertEquals ("-2,2_5,06", -2.222222m, Decimal.Round (-2.2222225m, 6));
1290 AssertEquals ("-2,2_5,07", -2.2222222m, Decimal.Round (-2.22222225m, 7));
1291 AssertEquals ("-2,2_5,08", -2.22222222m, Decimal.Round (-2.222222225m, 8));
1292 AssertEquals ("-2,2_5,09", -2.222222222m, Decimal.Round (-2.2222222225m, 9));
1293 AssertEquals ("-2,2_5,10", -2.2222222222m, Decimal.Round (-2.22222222225m, 10));
1294 AssertEquals ("-2,2_5,11", -2.22222222222m, Decimal.Round (-2.222222222225m, 11));
1295 AssertEquals ("-2,2_5,12", -2.222222222222m, Decimal.Round (-2.2222222222225m, 12));
1296 AssertEquals ("-2,2_5,13", -2.2222222222222m, Decimal.Round (-2.22222222222225m, 13));
1297 AssertEquals ("-2,2_5,14", -2.22222222222222m, Decimal.Round (-2.222222222222225m, 14));
1298 AssertEquals ("-2,2_5,15", -2.222222222222222m, Decimal.Round (-2.2222222222222225m, 15));
1299 AssertEquals ("-2,2_5,16", -2.2222222222222222m, Decimal.Round (-2.22222222222222225m, 16));
1300 AssertEquals ("-2,2_5,17", -2.22222222222222222m, Decimal.Round (-2.222222222222222225m, 17));
1301 AssertEquals ("-2,2_5,18", -2.222222222222222222m, Decimal.Round (-2.2222222222222222225m, 18));
1302 AssertEquals ("-2,2_5,19", -2.2222222222222222222m, Decimal.Round (-2.22222222222222222225m, 19));
1303 AssertEquals ("-2,2_5,20", -2.22222222222222222222m, Decimal.Round (-2.222222222222222222225m, 20));
1304 AssertEquals ("-2,2_5,21", -2.222222222222222222222m, Decimal.Round (-2.2222222222222222222225m, 21));
1305 AssertEquals ("-2,2_5,22", -2.2222222222222222222222m, Decimal.Round (-2.22222222222222222222225m, 22));
1306 AssertEquals ("-2,2_5,23", -2.22222222222222222222222m, Decimal.Round (-2.222222222222222222222225m, 23));
1307 AssertEquals ("-2,2_5,24", -2.222222222222222222222222m, Decimal.Round (-2.2222222222222222222222225m, 24));
1308 AssertEquals ("-2,2_5,25", -2.2222222222222222222222222m, Decimal.Round (-2.22222222222222222222222225m, 25));
1309 AssertEquals ("-2,2_5,26", -2.22222222222222222222222222m, Decimal.Round (-2.222222222222222222222222225m, 26));
1310 AssertEquals ("-2,2_5,27", -2.222222222222222222222222222m, Decimal.Round (-2.2222222222222222222222222225m, 27));
1311 AssertEquals ("-2,2_5,28", -2.2222222222222222222222222222m, Decimal.Round (-2.22222222222222222222222222225m, 28));
1314 [Test] // bug #59425
1315 public void ParseAndKeepPrecision ()
1318 AssertEquals (value, value, Decimal.Parse (value).ToString ());
1320 for (int i = 0; i < 28; i++) {
1322 AssertEquals (i.ToString (), value, Decimal.Parse (value).ToString ());
1326 AssertEquals (value, value, Decimal.Parse (value).ToString ());
1328 for (int i = 0; i < 28; i++) {
1330 AssertEquals ("-" + i.ToString (), value, Decimal.Parse (value).ToString ());
1335 public void ToString_G ()
1337 AssertEquals ("00", "1.0", (1.0m).ToString ());
1338 AssertEquals ("01", "0.1", (0.1m).ToString ());
1339 AssertEquals ("02", "0.01", (0.01m).ToString ());
1340 AssertEquals ("03", "0.001", (0.001m).ToString ());
1341 AssertEquals ("04", "0.0001", (0.0001m).ToString ());
1342 AssertEquals ("05", "0.00001", (0.00001m).ToString ());
1343 AssertEquals ("06", "0.000001", (0.000001m).ToString ());
1344 AssertEquals ("07", "0.0000001", (0.0000001m).ToString ());
1345 AssertEquals ("08", "0.00000001", (0.00000001m).ToString ());
1346 AssertEquals ("09", "0.000000001", (0.000000001m).ToString ());
1347 AssertEquals ("10", "0.0000000001", (0.0000000001m).ToString ());
1348 AssertEquals ("11", "0.00000000001", (0.00000000001m).ToString ());
1349 AssertEquals ("12", "0.000000000001", (0.000000000001m).ToString ());
1350 AssertEquals ("13", "0.0000000000001", (0.0000000000001m).ToString ());
1351 AssertEquals ("14", "0.00000000000001", (0.00000000000001m).ToString ());
1352 AssertEquals ("15", "0.000000000000001", (0.000000000000001m).ToString ());
1353 AssertEquals ("16", "0.0000000000000001", (0.0000000000000001m).ToString ());
1354 AssertEquals ("17", "0.00000000000000001", (0.00000000000000001m).ToString ());
1355 AssertEquals ("18", "0.000000000000000001", (0.000000000000000001m).ToString ());
1356 AssertEquals ("19", "0.0000000000000000001", (0.0000000000000000001m).ToString ());
1357 AssertEquals ("20", "0.00000000000000000001", (0.00000000000000000001m).ToString ());
1358 AssertEquals ("21", "0.000000000000000000001", (0.000000000000000000001m).ToString ());
1359 AssertEquals ("22", "0.0000000000000000000001", (0.0000000000000000000001m).ToString ());
1360 AssertEquals ("23", "0.00000000000000000000001", (0.00000000000000000000001m).ToString ());
1361 AssertEquals ("24", "0.000000000000000000000001", (0.000000000000000000000001m).ToString ());
1362 AssertEquals ("25", "0.0000000000000000000000001", (0.0000000000000000000000001m).ToString ());
1363 AssertEquals ("26", "0.00000000000000000000000001", (0.00000000000000000000000001m).ToString ());
1364 AssertEquals ("27", "0.000000000000000000000000001", (0.000000000000000000000000001m).ToString ());
1365 AssertEquals ("28", "0.0000000000000000000000000001", (0.0000000000000000000000000001m).ToString ());
1370 public void MidpointRoundingAwayFromZero ()
1372 MidpointRounding m = MidpointRounding.AwayFromZero;
1373 AssertEquals ("#1", 4, Math.Round (3.5M, m));
1374 AssertEquals ("#2", 3, Math.Round (2.8M, m));
1375 AssertEquals ("#3", 3, Math.Round (2.5M, m));
1376 AssertEquals ("#4", 2, Math.Round (2.1M, m));
1377 AssertEquals ("#5", -2, Math.Round (-2.1M, m));
1378 AssertEquals ("#6", -3, Math.Round (-2.5M, m));
1379 AssertEquals ("#7", -3, Math.Round (-2.8M, m));
1380 AssertEquals ("#8", -4, Math.Round (-3.5M, m));
1382 AssertEquals ("#9", 3.1M, Math.Round (3.05M, 1, m));
1383 AssertEquals ("#10", 2.1M, Math.Round (2.08M, 1, m));
1384 AssertEquals ("#11", 2.1M, Math.Round (2.05M, 1, m));
1385 AssertEquals ("#12", 2.0M, Math.Round (2.01M, 1, m));
1386 AssertEquals ("#13", -2.0M, Math.Round (-2.01M, 1, m));
1387 AssertEquals ("#14", -2.1M, Math.Round (-2.05M, 1, m));
1388 AssertEquals ("#15", -2.1M, Math.Round (-2.08M, 1, m));
1389 AssertEquals ("#16", -3.1M, Math.Round (-3.05M, 1, m));