1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.harmony.tests.java.math; 19 20 import java.math.BigDecimal; 21 import java.math.BigInteger; 22 import java.math.MathContext; 23 import java.math.RoundingMode; 24 25 import junit.framework.TestCase; 26 27 /** 28 * Class: java.math.BigDecimal 29 * Methods: add, subtract, multiply, divide 30 */ 31 public class BigDecimalArithmeticTest extends TestCase { 32 /** 33 * Add two numbers of equal positive scales 34 */ 35 public void testAddEqualScalePosPos() { 36 String a = "1231212478987482988429808779810457634781384756794987"; 37 int aScale = 10; 38 String b = "747233429293018787918347987234564568"; 39 int bScale = 10; 40 String c = "123121247898748373566323807282924555312937.1991359555"; 41 int cScale = 10; 42 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 43 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 44 BigDecimal result = aNumber.add(bNumber); 45 assertEquals("incorrect value", c, result.toString()); 46 assertEquals("incorrect scale", cScale, result.scale()); 47 } 48 49 /** 50 * Add two numbers of equal positive scales using MathContext 51 */ 52 public void testAddMathContextEqualScalePosPos() { 53 String a = "1231212478987482988429808779810457634781384756794987"; 54 int aScale = 10; 55 String b = "747233429293018787918347987234564568"; 56 int bScale = 10; 57 String c = "1.2313E+41"; 58 int cScale = -37; 59 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 60 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 61 MathContext mc = new MathContext(5, RoundingMode.UP); 62 BigDecimal result = aNumber.add(bNumber, mc); 63 assertEquals("incorrect value", c, result.toString()); 64 assertEquals("incorrect scale", cScale, result.scale()); 65 } 66 67 /** 68 * Add two numbers of equal negative scales 69 */ 70 public void testAddEqualScaleNegNeg() { 71 String a = "1231212478987482988429808779810457634781384756794987"; 72 int aScale = -10; 73 String b = "747233429293018787918347987234564568"; 74 int bScale = -10; 75 String c = "1.231212478987483735663238072829245553129371991359555E+61"; 76 int cScale = -10; 77 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 78 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 79 BigDecimal result = aNumber.add(bNumber); 80 assertEquals("incorrect value", c, result.toString()); 81 assertEquals("incorrect scale", cScale, result.scale()); 82 } 83 84 /** 85 * Add two numbers of equal negative scales using MathContext 86 */ 87 public void testAddMathContextEqualScaleNegNeg() { 88 String a = "1231212478987482988429808779810457634781384756794987"; 89 int aScale = -10; 90 String b = "747233429293018787918347987234564568"; 91 int bScale = -10; 92 String c = "1.2312E+61"; 93 int cScale = -57; 94 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 95 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 96 MathContext mc = new MathContext(5, RoundingMode.FLOOR); 97 BigDecimal result = aNumber.add(bNumber, mc); 98 assertEquals("incorrect value ", c, result.toString()); 99 assertEquals("incorrect scale", cScale, result.scale()); 100 } 101 102 /** 103 * Add two numbers of different scales; the first is positive 104 */ 105 public void testAddDiffScalePosNeg() { 106 String a = "1231212478987482988429808779810457634781384756794987"; 107 int aScale = 15; 108 String b = "747233429293018787918347987234564568"; 109 int bScale = -10; 110 String c = "7472334294161400358170962860775454459810457634.781384756794987"; 111 int cScale = 15; 112 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 113 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 114 BigDecimal result = aNumber.add(bNumber); 115 assertEquals("incorrect value", c, result.toString()); 116 assertEquals("incorrect scale", cScale, result.scale()); 117 } 118 119 /** 120 * Add two numbers of different scales using MathContext; the first is positive 121 */ 122 public void testAddMathContextDiffScalePosNeg() { 123 String a = "1231212478987482988429808779810457634781384756794987"; 124 int aScale = 15; 125 String b = "747233429293018787918347987234564568"; 126 int bScale = -10; 127 String c = "7.47233429416141E+45"; 128 int cScale = -31; 129 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 130 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 131 MathContext mc = new MathContext(15, RoundingMode.CEILING); 132 BigDecimal result = aNumber.add(bNumber, mc); 133 assertEquals("incorrect value", c, c.toString()); 134 assertEquals("incorrect scale", cScale, result.scale()); 135 } 136 137 /** 138 * Add two numbers of different scales; the first is negative 139 */ 140 public void testAddDiffScaleNegPos() { 141 String a = "1231212478987482988429808779810457634781384756794987"; 142 int aScale = -15; 143 String b = "747233429293018787918347987234564568"; 144 int bScale = 10; 145 String c = "1231212478987482988429808779810457634781459480137916301878791834798.7234564568"; 146 int cScale = 10; 147 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 148 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 149 BigDecimal result = aNumber.add(bNumber); 150 assertEquals("incorrect value", c, result.toString()); 151 assertEquals("incorrect scale", cScale, result.scale()); 152 } 153 154 /** 155 * Add two zeroes of different scales; the first is negative 156 */ 157 public void testAddDiffScaleZeroZero() { 158 String a = "0"; 159 int aScale = -15; 160 String b = "0"; 161 int bScale = 10; 162 String c = "0E-10"; 163 int cScale = 10; 164 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 165 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 166 BigDecimal result = aNumber.add(bNumber); 167 assertEquals("incorrect value", c, result.toString()); 168 assertEquals("incorrect scale", cScale, result.scale()); 169 } 170 171 /** 172 * Subtract two numbers of equal positive scales 173 */ 174 public void testSubtractEqualScalePosPos() { 175 String a = "1231212478987482988429808779810457634781384756794987"; 176 int aScale = 10; 177 String b = "747233429293018787918347987234564568"; 178 int bScale = 10; 179 String c = "123121247898748224119637948679166971643339.7522230419"; 180 int cScale = 10; 181 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 182 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 183 BigDecimal result = aNumber.subtract(bNumber); 184 assertEquals("incorrect value", c, result.toString()); 185 assertEquals("incorrect scale", cScale, result.scale()); 186 } 187 188 /** 189 * Subtract two numbers of equal positive scales using MathContext 190 */ 191 public void testSubtractMathContextEqualScalePosPos() { 192 String a = "1231212478987482988429808779810457634781384756794987"; 193 int aScale = 10; 194 String b = "747233429293018787918347987234564568"; 195 int bScale = 10; 196 String c = "1.23121247898749E+41"; 197 int cScale = -27; 198 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 199 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 200 MathContext mc = new MathContext(15, RoundingMode.CEILING); 201 BigDecimal result = aNumber.subtract(bNumber, mc); 202 assertEquals("incorrect value", c, result.toString()); 203 assertEquals("incorrect scale", cScale, result.scale()); 204 } 205 206 /** 207 * Subtract two numbers of equal negative scales 208 */ 209 public void testSubtractEqualScaleNegNeg() { 210 String a = "1231212478987482988429808779810457634781384756794987"; 211 int aScale = -10; 212 String b = "747233429293018787918347987234564568"; 213 int bScale = -10; 214 String c = "1.231212478987482241196379486791669716433397522230419E+61"; 215 int cScale = -10; 216 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 217 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 218 BigDecimal result = aNumber.subtract(bNumber); 219 assertEquals("incorrect value", c, result.toString()); 220 assertEquals("incorrect scale", cScale, result.scale()); 221 } 222 223 /** 224 * Subtract two numbers of different scales; the first is positive 225 */ 226 public void testSubtractDiffScalePosNeg() { 227 String a = "1231212478987482988429808779810457634781384756794987"; 228 int aScale = 15; 229 String b = "747233429293018787918347987234564568"; 230 int bScale = -10; 231 String c = "-7472334291698975400195996883915836900189542365.218615243205013"; 232 int cScale = 15; 233 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 234 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 235 BigDecimal result = aNumber.subtract(bNumber); 236 assertEquals("incorrect value", c, result.toString()); 237 assertEquals("incorrect scale", cScale, result.scale()); 238 } 239 240 /** 241 * Subtract two numbers of different scales using MathContext; 242 * the first is positive 243 */ 244 public void testSubtractMathContextDiffScalePosNeg() { 245 String a = "1231212478987482988429808779810457634781384756794987"; 246 int aScale = 15; 247 String b = "747233429293018787918347987234564568"; 248 int bScale = -10; 249 String c = "-7.4723342916989754E+45"; 250 int cScale = -29; 251 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 252 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 253 MathContext mc = new MathContext(17, RoundingMode.DOWN); 254 BigDecimal result = aNumber.subtract(bNumber, mc); 255 assertEquals("incorrect value", c, result.toString()); 256 assertEquals("incorrect scale", cScale, result.scale()); 257 } 258 259 /** 260 * Subtract two numbers of different scales; the first is negative 261 */ 262 public void testSubtractDiffScaleNegPos() { 263 String a = "1231212478987482988429808779810457634781384756794987"; 264 int aScale = -15; 265 String b = "747233429293018787918347987234564568"; 266 int bScale = 10; 267 String c = "1231212478987482988429808779810457634781310033452057698121208165201.2765435432"; 268 int cScale = 10; 269 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 270 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 271 BigDecimal result = aNumber.subtract(bNumber); 272 assertEquals("incorrect value", c, result.toString()); 273 assertEquals("incorrect scale", cScale, result.scale()); 274 } 275 276 /** 277 * Subtract two numbers of different scales using MathContext; 278 * the first is negative 279 */ 280 public void testSubtractMathContextDiffScaleNegPos() { 281 String a = "986798656676789766678767876078779810457634781384756794987"; 282 int aScale = -15; 283 String b = "747233429293018787918347987234564568"; 284 int bScale = 40; 285 String c = "9.867986566767897666787678760787798104576347813847567949870000000000000E+71"; 286 int cScale = -2; 287 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 288 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 289 MathContext mc = new MathContext(70, RoundingMode.HALF_DOWN); 290 BigDecimal result = aNumber.subtract(bNumber, mc); 291 assertEquals("incorrect value", c, result.toString()); 292 assertEquals("incorrect scale", cScale, result.scale()); 293 } 294 295 /** 296 * Multiply two numbers of positive scales 297 */ 298 public void testMultiplyScalePosPos() { 299 String a = "1231212478987482988429808779810457634781384756794987"; 300 int aScale = 15; 301 String b = "747233429293018787918347987234564568"; 302 int bScale = 10; 303 String c = "92000312286217574978643009574114545567010139156902666284589309.1880727173060570190220616"; 304 int cScale = 25; 305 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 306 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 307 BigDecimal result = aNumber.multiply(bNumber); 308 assertEquals("incorrect value", c, result.toString()); 309 assertEquals("incorrect scale", cScale, result.scale()); 310 } 311 312 /** 313 * Multiply two numbers of positive scales using MathContext 314 */ 315 public void testMultiplyMathContextScalePosPos() { 316 String a = "97665696756578755423325476545428779810457634781384756794987"; 317 int aScale = -25; 318 String b = "87656965586786097685674786576598865"; 319 int bScale = 10; 320 String c = "8.561078619600910561431314228543672720908E+108"; 321 int cScale = -69; 322 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 323 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 324 MathContext mc = new MathContext(40, RoundingMode.HALF_DOWN); 325 BigDecimal result = aNumber.multiply(bNumber, mc); 326 assertEquals("incorrect value", c, result.toString()); 327 assertEquals("incorrect scale", cScale, result.scale()); 328 } 329 330 /** 331 * Multiply two numbers of negative scales 332 */ 333 public void testMultiplyEqualScaleNegNeg() { 334 String a = "1231212478987482988429808779810457634781384756794987"; 335 int aScale = -15; 336 String b = "747233429293018787918347987234564568"; 337 int bScale = -10; 338 String c = "9.20003122862175749786430095741145455670101391569026662845893091880727173060570190220616E+111"; 339 int cScale = -25; 340 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 341 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 342 BigDecimal result = aNumber.multiply(bNumber); 343 assertEquals("incorrect value", c, result.toString()); 344 assertEquals("incorrect scale", cScale, result.scale()); 345 } 346 347 /** 348 * Multiply two numbers of different scales 349 */ 350 public void testMultiplyDiffScalePosNeg() { 351 String a = "1231212478987482988429808779810457634781384756794987"; 352 int aScale = 10; 353 String b = "747233429293018787918347987234564568"; 354 int bScale = -10; 355 String c = "920003122862175749786430095741145455670101391569026662845893091880727173060570190220616"; 356 int cScale = 0; 357 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 358 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 359 BigDecimal result = aNumber.multiply(bNumber); 360 assertEquals("incorrect value", c, result.toString()); 361 assertEquals("incorrect scale", cScale, result.scale()); 362 } 363 364 /** 365 * Multiply two numbers of different scales using MathContext 366 */ 367 public void testMultiplyMathContextDiffScalePosNeg() { 368 String a = "987667796597975765768768767866756808779810457634781384756794987"; 369 int aScale = 100; 370 String b = "747233429293018787918347987234564568"; 371 int bScale = -70; 372 String c = "7.3801839465418518653942222612429081498248509257207477E+68"; 373 int cScale = -16; 374 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 375 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 376 MathContext mc = new MathContext(53, RoundingMode.HALF_UP); 377 BigDecimal result = aNumber.multiply(bNumber, mc); 378 assertEquals("incorrect value", c, result.toString()); 379 assertEquals("incorrect scale", cScale, result.scale()); 380 } 381 382 /** 383 * Multiply two numbers of different scales 384 */ 385 public void testMultiplyDiffScaleNegPos() { 386 String a = "1231212478987482988429808779810457634781384756794987"; 387 int aScale = -15; 388 String b = "747233429293018787918347987234564568"; 389 int bScale = 10; 390 String c = "9.20003122862175749786430095741145455670101391569026662845893091880727173060570190220616E+91"; 391 int cScale = -5; 392 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 393 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 394 BigDecimal result = aNumber.multiply(bNumber); 395 assertEquals("incorrect value", c, result.toString()); 396 assertEquals("incorrect scale", cScale, result.scale()); 397 } 398 399 /** 400 * Multiply two numbers of different scales using MathContext 401 */ 402 public void testMultiplyMathContextDiffScaleNegPos() { 403 String a = "488757458676796558668876576576579097029810457634781384756794987"; 404 int aScale = -63; 405 String b = "747233429293018787918347987234564568"; 406 int bScale = 63; 407 String c = "3.6521591193960361339707130098174381429788164316E+98"; 408 int cScale = -52; 409 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 410 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 411 MathContext mc = new MathContext(47, RoundingMode.HALF_UP); 412 BigDecimal result = aNumber.multiply(bNumber, mc); 413 assertEquals("incorrect value", c, result.toString()); 414 assertEquals("incorrect scale", cScale, result.scale()); 415 } 416 417 /** 418 * pow(int) 419 */ 420 public void testPow() { 421 String a = "123121247898748298842980"; 422 int aScale = 10; 423 int exp = 10; 424 String c = "8004424019039195734129783677098845174704975003788210729597" + 425 "4875206425711159855030832837132149513512555214958035390490" + 426 "798520842025826.594316163502809818340013610490541783276343" + 427 "6514490899700151256484355936102754469438371850240000000000"; 428 int cScale = 100; 429 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 430 BigDecimal result = aNumber.pow(exp); 431 assertEquals("incorrect value", c, result.toString()); 432 assertEquals("incorrect scale", cScale, result.scale()); 433 } 434 435 /** 436 * pow(0) 437 */ 438 public void testPow0() { 439 String a = "123121247898748298842980"; 440 int aScale = 10; 441 int exp = 0; 442 String c = "1"; 443 int cScale = 0; 444 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 445 BigDecimal result = aNumber.pow(exp); 446 assertEquals("incorrect value", c, result.toString()); 447 assertEquals("incorrect scale", cScale, result.scale()); 448 } 449 450 /** 451 * ZERO.pow(0) 452 */ 453 public void testZeroPow0() { 454 String c = "1"; 455 int cScale = 0; 456 BigDecimal result = BigDecimal.ZERO.pow(0); 457 assertEquals("incorrect value", c, result.toString()); 458 assertEquals("incorrect scale", cScale, result.scale()); 459 } 460 461 /** 462 * pow(int, MathContext) 463 */ 464 public void testPowMathContext() { 465 String a = "123121247898748298842980"; 466 int aScale = 10; 467 int exp = 10; 468 String c = "8.0044E+130"; 469 int cScale = -126; 470 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 471 MathContext mc = new MathContext(5, RoundingMode.HALF_UP); 472 BigDecimal result = aNumber.pow(exp, mc); 473 assertEquals("incorrect value", c, result.toString()); 474 assertEquals("incorrect scale", cScale, result.scale()); 475 } 476 477 /** 478 * Divide by zero 479 */ 480 public void testDivideByZero() { 481 String a = "1231212478987482988429808779810457634781384756794987"; 482 int aScale = 15; 483 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 484 BigDecimal bNumber = BigDecimal.valueOf(0L); 485 try { 486 aNumber.divide(bNumber); 487 fail("ArithmeticException has not been caught"); 488 } catch (ArithmeticException e) { 489 assertEquals("Improper exception message", "Division by zero", e.getMessage()); 490 } 491 } 492 493 /** 494 * Divide with ROUND_UNNECESSARY 495 */ 496 public void testDivideExceptionRM() { 497 String a = "1231212478987482988429808779810457634781384756794987"; 498 int aScale = 15; 499 String b = "747233429293018787918347987234564568"; 500 int bScale = 10; 501 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 502 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 503 try { 504 aNumber.divide(bNumber, BigDecimal.ROUND_UNNECESSARY); 505 fail("ArithmeticException has not been caught"); 506 } catch (ArithmeticException e) { 507 assertEquals("Improper exception message", "Rounding necessary", e.getMessage()); 508 } 509 } 510 511 /** 512 * Divide with invalid rounding mode 513 */ 514 public void testDivideExceptionInvalidRM() { 515 String a = "1231212478987482988429808779810457634781384756794987"; 516 int aScale = 15; 517 String b = "747233429293018787918347987234564568"; 518 int bScale = 10; 519 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 520 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 521 try { 522 aNumber.divide(bNumber, 100); 523 fail("IllegalArgumentException has not been caught"); 524 } catch (IllegalArgumentException e) { 525 assertEquals("Improper exception message", "Invalid rounding mode", e.getMessage()); 526 } 527 } 528 529 /** 530 * Divide: local variable exponent is less than zero 531 */ 532 public void testDivideExpLessZero() { 533 String a = "1231212478987482988429808779810457634781384756794987"; 534 int aScale = 15; 535 String b = "747233429293018787918347987234564568"; 536 int bScale = 10; 537 String c = "1.64770E+10"; 538 int resScale = -5; 539 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 540 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 541 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_CEILING); 542 assertEquals("incorrect value", c, result.toString()); 543 assertEquals("incorrect scale", resScale, result.scale()); 544 } 545 546 /** 547 * Divide: local variable exponent is equal to zero 548 */ 549 public void testDivideExpEqualsZero() { 550 String a = "1231212478987482988429808779810457634781384756794987"; 551 int aScale = -15; 552 String b = "747233429293018787918347987234564568"; 553 int bScale = 10; 554 String c = "1.64769459009933764189139568605273529E+40"; 555 int resScale = -5; 556 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 557 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 558 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_CEILING); 559 assertEquals("incorrect value", c, result.toString()); 560 assertEquals("incorrect scale", resScale, result.scale()); 561 } 562 563 /** 564 * Divide: local variable exponent is greater than zero 565 */ 566 public void testDivideExpGreaterZero() { 567 String a = "1231212478987482988429808779810457634781384756794987"; 568 int aScale = -15; 569 String b = "747233429293018787918347987234564568"; 570 int bScale = 20; 571 String c = "1.647694590099337641891395686052735285121058381E+50"; 572 int resScale = -5; 573 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 574 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 575 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_CEILING); 576 assertEquals("incorrect value", c, result.toString()); 577 assertEquals("incorrect scale", resScale, result.scale()); 578 } 579 580 /** 581 * Divide: remainder is zero 582 */ 583 public void testDivideRemainderIsZero() { 584 String a = "8311389578904553209874735431110"; 585 int aScale = -15; 586 String b = "237468273682987234567849583746"; 587 int bScale = 20; 588 String c = "3.5000000000000000000000000000000E+36"; 589 int resScale = -5; 590 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 591 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 592 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_CEILING); 593 assertEquals("incorrect value", c, result.toString()); 594 assertEquals("incorrect scale", resScale, result.scale()); 595 } 596 597 /** 598 * Divide: rounding mode is ROUND_UP, result is negative 599 */ 600 public void testDivideRoundUpNeg() { 601 String a = "-92948782094488478231212478987482988429808779810457634781384756794987"; 602 int aScale = -24; 603 String b = "7472334223847623782375469293018787918347987234564568"; 604 int bScale = 13; 605 String c = "-1.24390557635720517122423359799284E+53"; 606 int resScale = -21; 607 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 608 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 609 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_UP); 610 assertEquals("incorrect value", c, result.toString()); 611 assertEquals("incorrect scale", resScale, result.scale()); 612 } 613 614 /** 615 * Divide: rounding mode is ROUND_UP, result is positive 616 */ 617 public void testDivideRoundUpPos() { 618 String a = "92948782094488478231212478987482988429808779810457634781384756794987"; 619 int aScale = -24; 620 String b = "7472334223847623782375469293018787918347987234564568"; 621 int bScale = 13; 622 String c = "1.24390557635720517122423359799284E+53"; 623 int resScale = -21; 624 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 625 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 626 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_UP); 627 assertEquals("incorrect value", c, result.toString()); 628 assertEquals("incorrect scale", resScale, result.scale()); 629 } 630 631 /** 632 * Divide: rounding mode is ROUND_DOWN, result is negative 633 */ 634 public void testDivideRoundDownNeg() { 635 String a = "-92948782094488478231212478987482988429808779810457634781384756794987"; 636 int aScale = -24; 637 String b = "7472334223847623782375469293018787918347987234564568"; 638 int bScale = 13; 639 String c = "-1.24390557635720517122423359799283E+53"; 640 int resScale = -21; 641 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 642 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 643 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_DOWN); 644 assertEquals("incorrect value", c, result.toString()); 645 assertEquals("incorrect scale", resScale, result.scale()); 646 } 647 648 /** 649 * Divide: rounding mode is ROUND_DOWN, result is positive 650 */ 651 public void testDivideRoundDownPos() { 652 String a = "92948782094488478231212478987482988429808779810457634781384756794987"; 653 int aScale = -24; 654 String b = "7472334223847623782375469293018787918347987234564568"; 655 int bScale = 13; 656 String c = "1.24390557635720517122423359799283E+53"; 657 int resScale = -21; 658 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 659 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 660 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_DOWN); 661 assertEquals("incorrect value", c, result.toString()); 662 assertEquals("incorrect scale", resScale, result.scale()); 663 } 664 665 /** 666 * Divide: rounding mode is ROUND_FLOOR, result is positive 667 */ 668 public void testDivideRoundFloorPos() { 669 String a = "92948782094488478231212478987482988429808779810457634781384756794987"; 670 int aScale = -24; 671 String b = "7472334223847623782375469293018787918347987234564568"; 672 int bScale = 13; 673 String c = "1.24390557635720517122423359799283E+53"; 674 int resScale = -21; 675 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 676 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 677 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_FLOOR); 678 assertEquals("incorrect value", c, result.toString()); 679 assertEquals("incorrect scale", resScale, result.scale()); 680 } 681 682 /** 683 * Divide: rounding mode is ROUND_FLOOR, result is negative 684 */ 685 public void testDivideRoundFloorNeg() { 686 String a = "-92948782094488478231212478987482988429808779810457634781384756794987"; 687 int aScale = -24; 688 String b = "7472334223847623782375469293018787918347987234564568"; 689 int bScale = 13; 690 String c = "-1.24390557635720517122423359799284E+53"; 691 int resScale = -21; 692 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 693 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 694 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_FLOOR); 695 assertEquals("incorrect value", c, result.toString()); 696 assertEquals("incorrect scale", resScale, result.scale()); 697 } 698 699 /** 700 * Divide: rounding mode is ROUND_CEILING, result is positive 701 */ 702 public void testDivideRoundCeilingPos() { 703 String a = "92948782094488478231212478987482988429808779810457634781384756794987"; 704 int aScale = -24; 705 String b = "7472334223847623782375469293018787918347987234564568"; 706 int bScale = 13; 707 String c = "1.24390557635720517122423359799284E+53"; 708 int resScale = -21; 709 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 710 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 711 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_CEILING); 712 assertEquals("incorrect value", c, result.toString()); 713 assertEquals("incorrect scale", resScale, result.scale()); 714 } 715 716 /** 717 * Divide: rounding mode is ROUND_CEILING, result is negative 718 */ 719 public void testDivideRoundCeilingNeg() { 720 String a = "-92948782094488478231212478987482988429808779810457634781384756794987"; 721 int aScale = -24; 722 String b = "7472334223847623782375469293018787918347987234564568"; 723 int bScale = 13; 724 String c = "-1.24390557635720517122423359799283E+53"; 725 int resScale = -21; 726 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 727 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 728 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_CEILING); 729 assertEquals("incorrect value", c, result.toString()); 730 assertEquals("incorrect scale", resScale, result.scale()); 731 } 732 733 /** 734 * Divide: rounding mode is ROUND_HALF_UP, result is positive; distance = -1 735 */ 736 public void testDivideRoundHalfUpPos() { 737 String a = "92948782094488478231212478987482988429808779810457634781384756794987"; 738 int aScale = -24; 739 String b = "7472334223847623782375469293018787918347987234564568"; 740 int bScale = 13; 741 String c = "1.24390557635720517122423359799284E+53"; 742 int resScale = -21; 743 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 744 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 745 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_UP); 746 assertEquals("incorrect value", c, result.toString()); 747 assertEquals("incorrect scale", resScale, result.scale()); 748 } 749 750 /** 751 * Divide: rounding mode is ROUND_HALF_UP, result is negative; distance = -1 752 */ 753 public void testDivideRoundHalfUpNeg() { 754 String a = "-92948782094488478231212478987482988429808779810457634781384756794987"; 755 int aScale = -24; 756 String b = "7472334223847623782375469293018787918347987234564568"; 757 int bScale = 13; 758 String c = "-1.24390557635720517122423359799284E+53"; 759 int resScale = -21; 760 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 761 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 762 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_UP); 763 assertEquals("incorrect value", c, result.toString()); 764 assertEquals("incorrect scale", resScale, result.scale()); 765 } 766 767 /** 768 * Divide: rounding mode is ROUND_HALF_UP, result is positive; distance = 1 769 */ 770 public void testDivideRoundHalfUpPos1() { 771 String a = "92948782094488478231212478987482988798104576347813847567949855464535634534563456"; 772 int aScale = -24; 773 String b = "74723342238476237823754692930187879183479"; 774 int bScale = 13; 775 String c = "1.2439055763572051712242335979928354832010167729111113605E+76"; 776 int resScale = -21; 777 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 778 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 779 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_UP); 780 assertEquals("incorrect value", c, result.toString()); 781 assertEquals("incorrect scale", resScale, result.scale()); 782 } 783 784 /** 785 * Divide: rounding mode is ROUND_HALF_UP, result is negative; distance = 1 786 */ 787 public void testDivideRoundHalfUpNeg1() { 788 String a = "-92948782094488478231212478987482988798104576347813847567949855464535634534563456"; 789 int aScale = -24; 790 String b = "74723342238476237823754692930187879183479"; 791 int bScale = 13; 792 String c = "-1.2439055763572051712242335979928354832010167729111113605E+76"; 793 int resScale = -21; 794 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 795 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 796 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_UP); 797 assertEquals("incorrect value", c, result.toString()); 798 assertEquals("incorrect scale", resScale, result.scale()); 799 } 800 801 /** 802 * Divide: rounding mode is ROUND_HALF_UP, result is negative; equidistant 803 */ 804 public void testDivideRoundHalfUpNeg2() { 805 String a = "-37361671119238118911893939591735"; 806 int aScale = 10; 807 String b = "74723342238476237823787879183470"; 808 int bScale = 15; 809 String c = "-1E+5"; 810 int resScale = -5; 811 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 812 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 813 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_UP); 814 assertEquals("incorrect value", c, result.toString()); 815 assertEquals("incorrect scale", resScale, result.scale()); 816 } 817 818 /** 819 * Divide: rounding mode is ROUND_HALF_DOWN, result is positive; distance = -1 820 */ 821 public void testDivideRoundHalfDownPos() { 822 String a = "92948782094488478231212478987482988429808779810457634781384756794987"; 823 int aScale = -24; 824 String b = "7472334223847623782375469293018787918347987234564568"; 825 int bScale = 13; 826 String c = "1.24390557635720517122423359799284E+53"; 827 int resScale = -21; 828 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 829 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 830 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_DOWN); 831 assertEquals("incorrect value", c, result.toString()); 832 assertEquals("incorrect scale", resScale, result.scale()); 833 } 834 835 /** 836 * Divide: rounding mode is ROUND_HALF_DOWN, result is negative; distance = -1 837 */ 838 public void testDivideRoundHalfDownNeg() { 839 String a = "-92948782094488478231212478987482988429808779810457634781384756794987"; 840 int aScale = -24; 841 String b = "7472334223847623782375469293018787918347987234564568"; 842 int bScale = 13; 843 String c = "-1.24390557635720517122423359799284E+53"; 844 int resScale = -21; 845 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 846 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 847 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_DOWN); 848 assertEquals("incorrect value", c, result.toString()); 849 assertEquals("incorrect scale", resScale, result.scale()); 850 } 851 852 /** 853 * Divide: rounding mode is ROUND_HALF_DOWN, result is positive; distance = 1 854 */ 855 public void testDivideRoundHalfDownPos1() { 856 String a = "92948782094488478231212478987482988798104576347813847567949855464535634534563456"; 857 int aScale = -24; 858 String b = "74723342238476237823754692930187879183479"; 859 int bScale = 13; 860 String c = "1.2439055763572051712242335979928354832010167729111113605E+76"; 861 int resScale = -21; 862 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 863 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 864 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_DOWN); 865 assertEquals("incorrect value", c, result.toString()); 866 assertEquals("incorrect scale", resScale, result.scale()); 867 } 868 869 /** 870 * Divide: rounding mode is ROUND_HALF_DOWN, result is negative; distance = 1 871 */ 872 public void testDivideRoundHalfDownNeg1() { 873 String a = "-92948782094488478231212478987482988798104576347813847567949855464535634534563456"; 874 int aScale = -24; 875 String b = "74723342238476237823754692930187879183479"; 876 int bScale = 13; 877 String c = "-1.2439055763572051712242335979928354832010167729111113605E+76"; 878 int resScale = -21; 879 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 880 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 881 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_DOWN); 882 assertEquals("incorrect value", c, result.toString()); 883 assertEquals("incorrect scale", resScale, result.scale()); 884 } 885 886 /** 887 * Divide: rounding mode is ROUND_HALF_UP, result is negative; equidistant 888 */ 889 public void testDivideRoundHalfDownNeg2() { 890 String a = "-37361671119238118911893939591735"; 891 int aScale = 10; 892 String b = "74723342238476237823787879183470"; 893 int bScale = 15; 894 String c = "0E+5"; 895 int resScale = -5; 896 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 897 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 898 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_DOWN); 899 assertEquals("incorrect value", c, result.toString()); 900 assertEquals("incorrect scale", resScale, result.scale()); 901 } 902 903 /** 904 * Divide: rounding mode is ROUND_HALF_EVEN, result is positive; distance = -1 905 */ 906 public void testDivideRoundHalfEvenPos() { 907 String a = "92948782094488478231212478987482988429808779810457634781384756794987"; 908 int aScale = -24; 909 String b = "7472334223847623782375469293018787918347987234564568"; 910 int bScale = 13; 911 String c = "1.24390557635720517122423359799284E+53"; 912 int resScale = -21; 913 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 914 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 915 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_EVEN); 916 assertEquals("incorrect value", c, result.toString()); 917 assertEquals("incorrect scale", resScale, result.scale()); 918 } 919 920 /** 921 * Divide: rounding mode is ROUND_HALF_EVEN, result is negative; distance = -1 922 */ 923 public void testDivideRoundHalfEvenNeg() { 924 String a = "-92948782094488478231212478987482988429808779810457634781384756794987"; 925 int aScale = -24; 926 String b = "7472334223847623782375469293018787918347987234564568"; 927 int bScale = 13; 928 String c = "-1.24390557635720517122423359799284E+53"; 929 int resScale = -21; 930 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 931 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 932 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_EVEN); 933 assertEquals("incorrect value", c, result.toString()); 934 assertEquals("incorrect scale", resScale, result.scale()); 935 } 936 937 /** 938 * Divide: rounding mode is ROUND_HALF_EVEN, result is positive; distance = 1 939 */ 940 public void testDivideRoundHalfEvenPos1() { 941 String a = "92948782094488478231212478987482988798104576347813847567949855464535634534563456"; 942 int aScale = -24; 943 String b = "74723342238476237823754692930187879183479"; 944 int bScale = 13; 945 String c = "1.2439055763572051712242335979928354832010167729111113605E+76"; 946 int resScale = -21; 947 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 948 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 949 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_EVEN); 950 assertEquals("incorrect value", c, result.toString()); 951 assertEquals("incorrect scale", resScale, result.scale()); 952 } 953 954 /** 955 * Divide: rounding mode is ROUND_HALF_EVEN, result is negative; distance = 1 956 */ 957 public void testDivideRoundHalfEvenNeg1() { 958 String a = "-92948782094488478231212478987482988798104576347813847567949855464535634534563456"; 959 int aScale = -24; 960 String b = "74723342238476237823754692930187879183479"; 961 int bScale = 13; 962 String c = "-1.2439055763572051712242335979928354832010167729111113605E+76"; 963 int resScale = -21; 964 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 965 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 966 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_EVEN); 967 assertEquals("incorrect value", c, result.toString()); 968 assertEquals("incorrect scale", resScale, result.scale()); 969 } 970 971 /** 972 * Divide: rounding mode is ROUND_HALF_EVEN, result is negative; equidistant 973 */ 974 public void testDivideRoundHalfEvenNeg2() { 975 String a = "-37361671119238118911893939591735"; 976 int aScale = 10; 977 String b = "74723342238476237823787879183470"; 978 int bScale = 15; 979 String c = "0E+5"; 980 int resScale = -5; 981 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 982 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 983 BigDecimal result = aNumber.divide(bNumber, resScale, BigDecimal.ROUND_HALF_EVEN); 984 assertEquals("incorrect value", c, result.toString()); 985 assertEquals("incorrect scale", resScale, result.scale()); 986 } 987 988 /** 989 * Divide to BigDecimal 990 */ 991 public void testDivideBigDecimal1() { 992 String a = "-37361671119238118911893939591735"; 993 int aScale = 10; 994 String b = "74723342238476237823787879183470"; 995 int bScale = 15; 996 String c = "-5E+4"; 997 int resScale = -4; 998 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 999 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1000 BigDecimal result = aNumber.divide(bNumber); 1001 assertEquals("incorrect value", c, result.toString()); 1002 assertEquals("incorrect scale", resScale, result.scale()); 1003 } 1004 1005 /** 1006 * Divide to BigDecimal 1007 */ 1008 public void testDivideBigDecimal2() { 1009 String a = "-37361671119238118911893939591735"; 1010 int aScale = 10; 1011 String b = "74723342238476237823787879183470"; 1012 int bScale = -15; 1013 String c = "-5E-26"; 1014 int resScale = 26; 1015 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1016 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1017 BigDecimal result = aNumber.divide(bNumber); 1018 assertEquals("incorrect value", c, result.toString()); 1019 assertEquals("incorrect scale", resScale, result.scale()); 1020 } 1021 1022 /** 1023 * divide(BigDecimal, scale, RoundingMode) 1024 */ 1025 public void testDivideBigDecimalScaleRoundingModeUP() { 1026 String a = "-37361671119238118911893939591735"; 1027 int aScale = 10; 1028 String b = "74723342238476237823787879183470"; 1029 int bScale = -15; 1030 int newScale = 31; 1031 RoundingMode rm = RoundingMode.UP; 1032 String c = "-5.00000E-26"; 1033 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1034 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1035 BigDecimal result = aNumber.divide(bNumber, newScale, rm); 1036 assertEquals("incorrect value", c, result.toString()); 1037 assertEquals("incorrect scale", newScale, result.scale()); 1038 } 1039 1040 /** 1041 * divide(BigDecimal, scale, RoundingMode) 1042 */ 1043 public void testDivideBigDecimalScaleRoundingModeDOWN() { 1044 String a = "-37361671119238118911893939591735"; 1045 int aScale = 10; 1046 String b = "74723342238476237823787879183470"; 1047 int bScale = 15; 1048 int newScale = 31; 1049 RoundingMode rm = RoundingMode.DOWN; 1050 String c = "-50000.0000000000000000000000000000000"; 1051 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1052 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1053 BigDecimal result = aNumber.divide(bNumber, newScale, rm); 1054 assertEquals("incorrect value", c, result.toString()); 1055 assertEquals("incorrect scale", newScale, result.scale()); 1056 } 1057 1058 /** 1059 * divide(BigDecimal, scale, RoundingMode) 1060 */ 1061 public void testDivideBigDecimalScaleRoundingModeCEILING() { 1062 String a = "3736186567876876578956958765675671119238118911893939591735"; 1063 int aScale = 100; 1064 String b = "74723342238476237823787879183470"; 1065 int bScale = 15; 1066 int newScale = 45; 1067 RoundingMode rm = RoundingMode.CEILING; 1068 String c = "1E-45"; 1069 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1070 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1071 BigDecimal result = aNumber.divide(bNumber, newScale, rm); 1072 assertEquals("incorrect value", c, result.toString()); 1073 assertEquals("incorrect scale", newScale, result.scale()); 1074 } 1075 1076 /** 1077 * divide(BigDecimal, scale, RoundingMode) 1078 */ 1079 public void testDivideBigDecimalScaleRoundingModeFLOOR() { 1080 String a = "3736186567876876578956958765675671119238118911893939591735"; 1081 int aScale = 100; 1082 String b = "74723342238476237823787879183470"; 1083 int bScale = 15; 1084 int newScale = 45; 1085 RoundingMode rm = RoundingMode.FLOOR; 1086 String c = "0E-45"; 1087 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1088 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1089 BigDecimal result = aNumber.divide(bNumber, newScale, rm); 1090 assertEquals("incorrect value", c, result.toString()); 1091 assertEquals("incorrect scale", newScale, result.scale()); 1092 } 1093 1094 /** 1095 * divide(BigDecimal, scale, RoundingMode) 1096 */ 1097 public void testDivideBigDecimalScaleRoundingModeHALF_UP() { 1098 String a = "3736186567876876578956958765675671119238118911893939591735"; 1099 int aScale = -51; 1100 String b = "74723342238476237823787879183470"; 1101 int bScale = 45; 1102 int newScale = 3; 1103 RoundingMode rm = RoundingMode.HALF_UP; 1104 String c = "50000260373164286401361913262100972218038099522752460421" + 1105 "05959924024355721031761947728703598332749334086415670525" + 1106 "3761096961.670"; 1107 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1108 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1109 BigDecimal result = aNumber.divide(bNumber, newScale, rm); 1110 assertEquals("incorrect value", c, result.toString()); 1111 assertEquals("incorrect scale", newScale, result.scale()); 1112 } 1113 1114 /** 1115 * divide(BigDecimal, scale, RoundingMode) 1116 */ 1117 public void testDivideBigDecimalScaleRoundingModeHALF_DOWN() { 1118 String a = "3736186567876876578956958765675671119238118911893939591735"; 1119 int aScale = 5; 1120 String b = "74723342238476237823787879183470"; 1121 int bScale = 15; 1122 int newScale = 7; 1123 RoundingMode rm = RoundingMode.HALF_DOWN; 1124 String c = "500002603731642864013619132621009722.1803810"; 1125 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1126 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1127 BigDecimal result = aNumber.divide(bNumber, newScale, rm); 1128 assertEquals("incorrect value", c, result.toString()); 1129 assertEquals("incorrect scale", newScale, result.scale()); 1130 } 1131 1132 /** 1133 * divide(BigDecimal, scale, RoundingMode) 1134 */ 1135 public void testDivideBigDecimalScaleRoundingModeHALF_EVEN() { 1136 String a = "3736186567876876578956958765675671119238118911893939591735"; 1137 int aScale = 5; 1138 String b = "74723342238476237823787879183470"; 1139 int bScale = 15; 1140 int newScale = 7; 1141 RoundingMode rm = RoundingMode.HALF_EVEN; 1142 String c = "500002603731642864013619132621009722.1803810"; 1143 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1144 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1145 BigDecimal result = aNumber.divide(bNumber, newScale, rm); 1146 assertEquals("incorrect value", c, result.toString()); 1147 assertEquals("incorrect scale", newScale, result.scale()); 1148 } 1149 1150 /** 1151 * divide(BigDecimal, MathContext) 1152 */ 1153 public void testDivideBigDecimalScaleMathContextUP() { 1154 String a = "3736186567876876578956958765675671119238118911893939591735"; 1155 int aScale = 15; 1156 String b = "748766876876723342238476237823787879183470"; 1157 int bScale = 10; 1158 int precision = 21; 1159 RoundingMode rm = RoundingMode.UP; 1160 MathContext mc = new MathContext(precision, rm); 1161 String c = "49897861180.2562512996"; 1162 int resScale = 10; 1163 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1164 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1165 BigDecimal result = aNumber.divide(bNumber, mc); 1166 assertEquals("incorrect value", c, result.toString()); 1167 assertEquals("incorrect scale", resScale, result.scale()); 1168 } 1169 1170 /** 1171 * divide(BigDecimal, MathContext) 1172 */ 1173 public void testDivideBigDecimalScaleMathContextDOWN() { 1174 String a = "3736186567876876578956958765675671119238118911893939591735"; 1175 int aScale = 15; 1176 String b = "748766876876723342238476237823787879183470"; 1177 int bScale = 70; 1178 int precision = 21; 1179 RoundingMode rm = RoundingMode.DOWN; 1180 MathContext mc = new MathContext(precision, rm); 1181 String c = "4.98978611802562512995E+70"; 1182 int resScale = -50; 1183 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1184 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1185 BigDecimal result = aNumber.divide(bNumber, mc); 1186 assertEquals("incorrect value", c, result.toString()); 1187 assertEquals("incorrect scale", resScale, result.scale()); 1188 } 1189 1190 /** 1191 * divide(BigDecimal, MathContext) 1192 */ 1193 public void testDivideBigDecimalScaleMathContextCEILING() { 1194 String a = "3736186567876876578956958765675671119238118911893939591735"; 1195 int aScale = 15; 1196 String b = "748766876876723342238476237823787879183470"; 1197 int bScale = 70; 1198 int precision = 21; 1199 RoundingMode rm = RoundingMode.CEILING; 1200 MathContext mc = new MathContext(precision, rm); 1201 String c = "4.98978611802562512996E+70"; 1202 int resScale = -50; 1203 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1204 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1205 BigDecimal result = aNumber.divide(bNumber, mc); 1206 assertEquals("incorrect value", c, result.toString()); 1207 assertEquals("incorrect scale", resScale, result.scale()); 1208 } 1209 1210 /** 1211 * divide(BigDecimal, MathContext) 1212 */ 1213 public void testDivideBigDecimalScaleMathContextFLOOR() { 1214 String a = "3736186567876876578956958765675671119238118911893939591735"; 1215 int aScale = 15; 1216 String b = "748766876876723342238476237823787879183470"; 1217 int bScale = 70; 1218 int precision = 21; 1219 RoundingMode rm = RoundingMode.FLOOR; 1220 MathContext mc = new MathContext(precision, rm); 1221 String c = "4.98978611802562512995E+70"; 1222 int resScale = -50; 1223 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1224 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1225 BigDecimal result = aNumber.divide(bNumber, mc); 1226 assertEquals("incorrect value", c, result.toString()); 1227 assertEquals("incorrect scale", resScale, result.scale()); 1228 } 1229 1230 /** 1231 * divide(BigDecimal, MathContext) 1232 */ 1233 public void testDivideBigDecimalScaleMathContextHALF_UP() { 1234 String a = "3736186567876876578956958765675671119238118911893939591735"; 1235 int aScale = 45; 1236 String b = "134432345432345748766876876723342238476237823787879183470"; 1237 int bScale = 70; 1238 int precision = 21; 1239 RoundingMode rm = RoundingMode.HALF_UP; 1240 MathContext mc = new MathContext(precision, rm); 1241 String c = "2.77923185514690367475E+26"; 1242 int resScale = -6; 1243 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1244 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1245 BigDecimal result = aNumber.divide(bNumber, mc); 1246 assertEquals("incorrect value", c, result.toString()); 1247 assertEquals("incorrect scale", resScale, result.scale()); 1248 } 1249 1250 /** 1251 * divide(BigDecimal, MathContext) 1252 */ 1253 public void testDivideBigDecimalScaleMathContextHALF_DOWN() { 1254 String a = "3736186567876876578956958765675671119238118911893939591735"; 1255 int aScale = 45; 1256 String b = "134432345432345748766876876723342238476237823787879183470"; 1257 int bScale = 70; 1258 int precision = 21; 1259 RoundingMode rm = RoundingMode.HALF_DOWN; 1260 MathContext mc = new MathContext(precision, rm); 1261 String c = "2.77923185514690367475E+26"; 1262 int resScale = -6; 1263 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1264 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1265 BigDecimal result = aNumber.divide(bNumber, mc); 1266 assertEquals("incorrect value", c, result.toString()); 1267 assertEquals("incorrect scale", resScale, result.scale()); 1268 } 1269 1270 /** 1271 * divide(BigDecimal, MathContext) 1272 */ 1273 public void testDivideBigDecimalScaleMathContextHALF_EVEN() { 1274 String a = "3736186567876876578956958765675671119238118911893939591735"; 1275 int aScale = 45; 1276 String b = "134432345432345748766876876723342238476237823787879183470"; 1277 int bScale = 70; 1278 int precision = 21; 1279 RoundingMode rm = RoundingMode.HALF_EVEN; 1280 MathContext mc = new MathContext(precision, rm); 1281 String c = "2.77923185514690367475E+26"; 1282 int resScale = -6; 1283 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1284 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1285 BigDecimal result = aNumber.divide(bNumber, mc); 1286 assertEquals("incorrect value", c, result.toString()); 1287 assertEquals("incorrect scale", resScale, result.scale()); 1288 } 1289 1290 1291 /** 1292 * BigDecimal.divide with a scale that's too large 1293 * 1294 * Regression test for HARMONY-6271 1295 */ 1296 public void testDivideLargeScale() { 1297 BigDecimal arg1 = new BigDecimal("320.0E+2147483647"); 1298 BigDecimal arg2 = new BigDecimal("6E-2147483647"); 1299 try { 1300 BigDecimal result = arg1.divide(arg2, Integer.MAX_VALUE, 1301 java.math.RoundingMode.CEILING); 1302 fail("Expected ArithmeticException when dividing with a scale that's too large"); 1303 } catch (ArithmeticException e) { 1304 // expected behaviour 1305 } 1306 } 1307 1308 /** 1309 * divideToIntegralValue(BigDecimal) 1310 */ 1311 public void testDivideToIntegralValue() { 1312 String a = "3736186567876876578956958765675671119238118911893939591735"; 1313 int aScale = 45; 1314 String b = "134432345432345748766876876723342238476237823787879183470"; 1315 int bScale = 70; 1316 String c = "277923185514690367474770683"; 1317 int resScale = 0; 1318 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1319 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1320 BigDecimal result = aNumber.divideToIntegralValue(bNumber); 1321 assertEquals("incorrect value", c, result.toString()); 1322 assertEquals("incorrect scale", resScale, result.scale()); 1323 } 1324 1325 /** 1326 * divideToIntegralValue(BigDecimal, MathContext) 1327 */ 1328 public void testDivideToIntegralValueMathContextUP() { 1329 String a = "3736186567876876578956958765675671119238118911893939591735"; 1330 int aScale = 45; 1331 String b = "134432345432345748766876876723342238476237823787879183470"; 1332 int bScale = 70; 1333 int precision = 32; 1334 RoundingMode rm = RoundingMode.UP; 1335 MathContext mc = new MathContext(precision, rm); 1336 String c = "277923185514690367474770683"; 1337 int resScale = 0; 1338 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1339 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1340 BigDecimal result = aNumber.divideToIntegralValue(bNumber, mc); 1341 assertEquals("incorrect value", c, result.toString()); 1342 assertEquals("incorrect scale", resScale, result.scale()); 1343 } 1344 1345 /** 1346 * divideToIntegralValue(BigDecimal, MathContext) 1347 */ 1348 public void testDivideToIntegralValueMathContextDOWN() { 1349 String a = "3736186567876876578956958769675785435673453453653543654354365435675671119238118911893939591735"; 1350 int aScale = 45; 1351 String b = "134432345432345748766876876723342238476237823787879183470"; 1352 int bScale = 70; 1353 int precision = 75; 1354 RoundingMode rm = RoundingMode.DOWN; 1355 MathContext mc = new MathContext(precision, rm); 1356 String c = "2.7792318551469036747477068339450205874992634417590178670822889E+62"; 1357 int resScale = -1; 1358 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1359 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1360 BigDecimal result = aNumber.divideToIntegralValue(bNumber, mc); 1361 assertEquals("incorrect value", c, result.toString()); 1362 assertEquals("incorrect scale", resScale, result.scale()); 1363 } 1364 1365 /** 1366 * divideAndRemainder(BigDecimal) 1367 */ 1368 public void testDivideAndRemainder1() { 1369 String a = "3736186567876876578956958765675671119238118911893939591735"; 1370 int aScale = 45; 1371 String b = "134432345432345748766876876723342238476237823787879183470"; 1372 int bScale = 70; 1373 String res = "277923185514690367474770683"; 1374 int resScale = 0; 1375 String rem = "1.3032693871288309587558885943391070087960319452465789990E-15"; 1376 int remScale = 70; 1377 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1378 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1379 BigDecimal result[] = aNumber.divideAndRemainder(bNumber); 1380 assertEquals("incorrect quotient value", res, result[0].toString()); 1381 assertEquals("incorrect quotient scale", resScale, result[0].scale()); 1382 assertEquals("incorrect remainder value", rem, result[1].toString()); 1383 assertEquals("incorrect remainder scale", remScale, result[1].scale()); 1384 } 1385 1386 /** 1387 * divideAndRemainder(BigDecimal) 1388 */ 1389 public void testDivideAndRemainder2() { 1390 String a = "3736186567876876578956958765675671119238118911893939591735"; 1391 int aScale = -45; 1392 String b = "134432345432345748766876876723342238476237823787879183470"; 1393 int bScale = 70; 1394 String res = "2779231855146903674747706830969461168692256919247547952" + 1395 "2608549363170374005512836303475980101168105698072946555" + 1396 "6862849"; 1397 int resScale = 0; 1398 String rem = "3.4935796954060524114470681810486417234751682675102093970E-15"; 1399 int remScale = 70; 1400 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1401 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1402 BigDecimal result[] = aNumber.divideAndRemainder(bNumber); 1403 assertEquals("incorrect quotient value", res, result[0].toString()); 1404 assertEquals("incorrect quotient scale", resScale, result[0].scale()); 1405 assertEquals("incorrect remainder value", rem, result[1].toString()); 1406 assertEquals("incorrect remainder scale", remScale, result[1].scale()); 1407 } 1408 1409 /** 1410 * divideAndRemainder(BigDecimal, MathContext) 1411 */ 1412 public void testDivideAndRemainderMathContextUP() { 1413 String a = "3736186567876876578956958765675671119238118911893939591735"; 1414 int aScale = 45; 1415 String b = "134432345432345748766876876723342238476237823787879183470"; 1416 int bScale = 70; 1417 int precision = 75; 1418 RoundingMode rm = RoundingMode.UP; 1419 MathContext mc = new MathContext(precision, rm); 1420 String res = "277923185514690367474770683"; 1421 int resScale = 0; 1422 String rem = "1.3032693871288309587558885943391070087960319452465789990E-15"; 1423 int remScale = 70; 1424 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1425 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1426 BigDecimal result[] = aNumber.divideAndRemainder(bNumber, mc); 1427 assertEquals("incorrect quotient value", res, result[0].toString()); 1428 assertEquals("incorrect quotient scale", resScale, result[0].scale()); 1429 assertEquals("incorrect remainder value", rem, result[1].toString()); 1430 assertEquals("incorrect remainder scale", remScale, result[1].scale()); 1431 } 1432 1433 /** 1434 * divideAndRemainder(BigDecimal, MathContext) 1435 */ 1436 public void testDivideAndRemainderMathContextDOWN() { 1437 String a = "3736186567876876578956958765675671119238118911893939591735"; 1438 int aScale = 45; 1439 String b = "134432345432345748766876876723342238476237823787879183470"; 1440 int bScale = 20; 1441 int precision = 15; 1442 RoundingMode rm = RoundingMode.DOWN; 1443 MathContext mc = new MathContext(precision, rm); 1444 String res = "0E-25"; 1445 int resScale = 25; 1446 String rem = "3736186567876.876578956958765675671119238118911893939591735"; 1447 int remScale = 45; 1448 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1449 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1450 BigDecimal result[] = aNumber.divideAndRemainder(bNumber, mc); 1451 assertEquals("incorrect quotient value", res, result[0].toString()); 1452 assertEquals("incorrect quotient scale", resScale, result[0].scale()); 1453 assertEquals("incorrect remainder value", rem, result[1].toString()); 1454 assertEquals("incorrect remainder scale", remScale, result[1].scale()); 1455 } 1456 1457 /** 1458 * remainder(BigDecimal) 1459 */ 1460 public void testRemainder1() { 1461 String a = "3736186567876876578956958765675671119238118911893939591735"; 1462 int aScale = 45; 1463 String b = "134432345432345748766876876723342238476237823787879183470"; 1464 int bScale = 10; 1465 String res = "3736186567876.876578956958765675671119238118911893939591735"; 1466 int resScale = 45; 1467 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1468 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1469 BigDecimal result = aNumber.remainder(bNumber); 1470 assertEquals("incorrect quotient value", res, result.toString()); 1471 assertEquals("incorrect quotient scale", resScale, result.scale()); 1472 } 1473 1474 /** 1475 * remainder(BigDecimal) 1476 */ 1477 public void testRemainder2() { 1478 String a = "3736186567876876578956958765675671119238118911893939591735"; 1479 int aScale = -45; 1480 String b = "134432345432345748766876876723342238476237823787879183470"; 1481 int bScale = 10; 1482 String res = "1149310942946292909508821656680979993738625937.2065885780"; 1483 int resScale = 10; 1484 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1485 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1486 BigDecimal result = aNumber.remainder(bNumber); 1487 assertEquals("incorrect quotient value", res, result.toString()); 1488 assertEquals("incorrect quotient scale", resScale, result.scale()); 1489 } 1490 1491 /** 1492 * remainder(BigDecimal, MathContext) 1493 */ 1494 public void testRemainderMathContextHALF_UP() { 1495 String a = "3736186567876876578956958765675671119238118911893939591735"; 1496 int aScale = 45; 1497 String b = "134432345432345748766876876723342238476237823787879183470"; 1498 int bScale = 10; 1499 int precision = 15; 1500 RoundingMode rm = RoundingMode.HALF_UP; 1501 MathContext mc = new MathContext(precision, rm); 1502 String res = "3736186567876.876578956958765675671119238118911893939591735"; 1503 int resScale = 45; 1504 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1505 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1506 BigDecimal result = aNumber.remainder(bNumber, mc); 1507 assertEquals("incorrect quotient value", res, result.toString()); 1508 assertEquals("incorrect quotient scale", resScale, result.scale()); 1509 } 1510 1511 /** 1512 * remainder(BigDecimal, MathContext) 1513 */ 1514 public void testRemainderMathContextHALF_DOWN() { 1515 String a = "3736186567876876578956958765675671119238118911893939591735"; 1516 int aScale = -45; 1517 String b = "134432345432345748766876876723342238476237823787879183470"; 1518 int bScale = 10; 1519 int precision = 75; 1520 RoundingMode rm = RoundingMode.HALF_DOWN; 1521 MathContext mc = new MathContext(precision, rm); 1522 String res = "1149310942946292909508821656680979993738625937.2065885780"; 1523 int resScale = 10; 1524 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1525 BigDecimal bNumber = new BigDecimal(new BigInteger(b), bScale); 1526 BigDecimal result = aNumber.remainder(bNumber, mc); 1527 assertEquals("incorrect quotient value", res, result.toString()); 1528 assertEquals("incorrect quotient scale", resScale, result.scale()); 1529 } 1530 1531 /** 1532 * round(BigDecimal, MathContext) 1533 */ 1534 public void testRoundMathContextHALF_DOWN() { 1535 String a = "3736186567876876578956958765675671119238118911893939591735"; 1536 int aScale = -45; 1537 int precision = 75; 1538 RoundingMode rm = RoundingMode.HALF_DOWN; 1539 MathContext mc = new MathContext(precision, rm); 1540 String res = "3.736186567876876578956958765675671119238118911893939591735E+102"; 1541 int resScale = -45; 1542 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1543 BigDecimal result = aNumber.round(mc); 1544 assertEquals("incorrect quotient value", res, result.toString()); 1545 assertEquals("incorrect quotient scale", resScale, result.scale()); 1546 } 1547 1548 /** 1549 * round(BigDecimal, MathContext) 1550 */ 1551 public void testRoundMathContextHALF_UP() { 1552 String a = "3736186567876876578956958765675671119238118911893939591735"; 1553 int aScale = 45; 1554 int precision = 15; 1555 RoundingMode rm = RoundingMode.HALF_UP; 1556 MathContext mc = new MathContext(precision, rm); 1557 String res = "3736186567876.88"; 1558 int resScale = 2; 1559 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1560 BigDecimal result = aNumber.round(mc); 1561 assertEquals("incorrect quotient value", res, result.toString()); 1562 assertEquals("incorrect quotient scale", resScale, result.scale()); 1563 } 1564 1565 /** 1566 * round(BigDecimal, MathContext) when precision = 0 1567 */ 1568 public void testRoundMathContextPrecision0() { 1569 String a = "3736186567876876578956958765675671119238118911893939591735"; 1570 int aScale = 45; 1571 int precision = 0; 1572 RoundingMode rm = RoundingMode.HALF_UP; 1573 MathContext mc = new MathContext(precision, rm); 1574 String res = "3736186567876.876578956958765675671119238118911893939591735"; 1575 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1576 BigDecimal result = aNumber.round(mc); 1577 assertEquals("incorrect quotient value", res, result.toString()); 1578 assertEquals("incorrect quotient scale", aScale, result.scale()); 1579 } 1580 1581 1582 /** 1583 * ulp() of a positive BigDecimal 1584 */ 1585 public void testUlpPos() { 1586 String a = "3736186567876876578956958765675671119238118911893939591735"; 1587 int aScale = -45; 1588 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1589 BigDecimal result = aNumber.ulp(); 1590 String res = "1E+45"; 1591 int resScale = -45; 1592 assertEquals("incorrect value", res, result.toString()); 1593 assertEquals("incorrect scale", resScale, result.scale()); 1594 } 1595 1596 /** 1597 * ulp() of a negative BigDecimal 1598 */ 1599 public void testUlpNeg() { 1600 String a = "-3736186567876876578956958765675671119238118911893939591735"; 1601 int aScale = 45; 1602 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1603 BigDecimal result = aNumber.ulp(); 1604 String res = "1E-45"; 1605 int resScale = 45; 1606 assertEquals("incorrect value", res, result.toString()); 1607 assertEquals("incorrect scale", resScale, result.scale()); 1608 } 1609 1610 /** 1611 * ulp() of a negative BigDecimal 1612 */ 1613 public void testUlpZero() { 1614 String a = "0"; 1615 int aScale = 2; 1616 BigDecimal aNumber = new BigDecimal(new BigInteger(a), aScale); 1617 BigDecimal result = aNumber.ulp(); 1618 String res = "0.01"; 1619 int resScale = 2; 1620 assertEquals("incorrect value", res, result.toString()); 1621 assertEquals("incorrect scale", resScale, result.scale()); 1622 } 1623 } 1624