diff --git a/strings/decimal.c b/strings/decimal.c index b88be6116a6c02fed3c889baa15bf1ea1534c3ad..4030261967608a8025ad6c260d056a2353452bf5 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -585,7 +585,7 @@ int decimal2bin(decimal *from, char *to, int precision, int frac) { dec1 mask=from->sign ? -1 : 0, *buf1=from->buf, *stop1; int error=E_DEC_OK, intg=precision-frac, - isize1, intg1, intg1x=from->intg, + isize1, intg1, intg1x, from_intg=from->intg, intg0=intg/DIG_PER_DEC1, frac0=frac/DIG_PER_DEC1, intg0x=intg-intg0*DIG_PER_DEC1, @@ -597,33 +597,33 @@ int decimal2bin(decimal *from, char *to, int precision, int frac) fsize1=frac1*sizeof(dec1)+dig2bytes[frac1x]; /* removing leading zeroes */ - intg1=((intg1x-1) % DIG_PER_DEC1)+1; - while (intg1x > 0 && *buf1 == 0) + intg1=((from_intg-1) % DIG_PER_DEC1)+1; + while (from_intg > 0 && *buf1 == 0) { - intg1x-=intg1; + from_intg-=intg1; intg1=DIG_PER_DEC1; buf1++; } - if (intg1x > 0) + if (from_intg > 0) { - for (intg1=(intg1x-1) % DIG_PER_DEC1; *buf1 < powers10[intg1--]; intg1x--) ; - DBUG_ASSERT(intg1x > 0); + for (intg1=(from_intg-1) % DIG_PER_DEC1; *buf1 < powers10[intg1--]; from_intg--) ; + DBUG_ASSERT(from_intg > 0); } else - intg1x=0; + from_intg=0; - if (unlikely(intg1x+fsize1==0)) + if (unlikely(from_intg+fsize1==0)) { mask=0; /* just in case */ intg=1; buf1=&mask; } - intg1=intg1x/DIG_PER_DEC1; - intg1x=intg1x-intg1*DIG_PER_DEC1; + intg1=from_intg/DIG_PER_DEC1; + intg1x=from_intg-intg1*DIG_PER_DEC1; isize1=intg1*sizeof(dec1)+dig2bytes[intg1x]; - if (isize0 < isize1) + if (intg < from_intg) { buf1+=intg1-intg0+(intg1x>0)-(intg0x>0); intg1=intg0; intg1x=intg0x; @@ -873,7 +873,7 @@ int decimal_round(decimal *from, decimal *to, int scale, decimal_round_mode mode error=E_DEC_TRUNCATED; } - if (scale+from->intg <= 0) + if (scale+from->intg < 0) { decimal_make_zero(to); return E_DEC_OK; @@ -944,6 +944,16 @@ int decimal_round(decimal *from, decimal *to, int scale, decimal_round_mode mode to->intg++; } } + else + { + while (unlikely(*buf1 == 0) && buf1 >= to->buf) + buf1--; + if (buf1 < to->buf) + { + decimal_make_zero(to); + return E_DEC_OK; + } + } if (scale<0) scale=0; done: @@ -2028,6 +2038,7 @@ main() test_d2b2d(".12345000098765", 30, 20); test_d2b2d("-.000000012345000098765", 30, 20); test_d2b2d("1234500009876.5", 30, 5); + test_d2b2d("111111111.11", 10, 2); printf("==== decimal_cmp ====\n"); test_dc("12","13"); @@ -2076,7 +2087,6 @@ main() test_ro("999999999999999999999.999", 0, CEILING); test_ro("-999999999999999999999.999", 0, FLOOR); - return 0; } #endif