test decimal input

This commit is contained in:
wangjiaming0909 2025-02-19 08:10:07 +08:00
parent dff26dc577
commit 78e49d22fe
2 changed files with 24 additions and 29 deletions

View File

@ -204,47 +204,38 @@ static int32_t decimalVarFromStr(const char* str, int32_t len, DecimalVar* resul
if (afterPoint) {
if (!rounded && curPrec - 1 == maxPrecision(result->type) && str[pos] >= '5') {
Decimal64 delta = {1};
if (places > 1) {
int32_t scaleUp = places - 1;
while (scaleUp != 0) {
int32_t curScale = TMIN(17, scaleUp);
pOps->multiply(result->pDec, &SCALE_MULTIPLIER_64[curScale], WORD_NUM(Decimal64));
scaleUp -= curScale;
}
result->precision += places - 1;
result->scale += places - 1;
int32_t scaleUp = places - 1;
while (scaleUp != 0) {
int32_t curScale = TMIN(17, scaleUp);
pOps->multiply(result->pDec, &SCALE_MULTIPLIER_64[curScale], WORD_NUM(Decimal64));
scaleUp -= curScale;
}
result->precision += places - 1;
result->scale += places - 1;
pOps->add(result->pDec, &delta, WORD_NUM(Decimal64));
rounded = true;
places = 0;
}
break;
} else {
return TSDB_CODE_DECIMAL_OVERFLOW;
}
} else {
if (afterPoint && result->precision == 0) {
result->precision = places;
result->scale = places;
} else {
result->precision += places;
if (afterPoint) {
result->scale += places;
}
while (places != 0) {
int32_t curScale = TMIN(17, places);
pOps->multiply(result->pDec, &SCALE_MULTIPLIER_64[curScale], WORD_NUM(Decimal64));
places -= curScale;
}
result->precision += places;
if (afterPoint) {
result->scale += places;
}
while (places != 0) {
int32_t curScale = TMIN(17, places);
pOps->multiply(result->pDec, &SCALE_MULTIPLIER_64[curScale], WORD_NUM(Decimal64));
places -= curScale;
}
Decimal64 digit = {str[pos] - '0'};
pOps->add(result->pDec, &digit, WORD_NUM(Decimal64));
places = 0;
break;
}
}
} break;
case 'e':
case 'E': {
//result->exponent += atoi(str + pos + 1);
stop = true;
} break;
default:
@ -252,8 +243,6 @@ static int32_t decimalVarFromStr(const char* str, int32_t len, DecimalVar* resul
break;
}
}
if (rounded) {
}
if (result->sign < 0) {
pOps->negate(result->pDec);
}

View File

@ -174,7 +174,7 @@ class Numeric {
if (prec > NumericType<BitNum>::maxPrec) throw std::string("prec too big") + std::to_string(prec);
int32_t code = dec_.fromStr(str, prec, scale) != 0;
if (code != 0) {
cout << "failed to init decimal from str: " << str << "\t";
cout << "failed to init decimal(" << (int32_t)prec << "," << (int32_t)scale << ") from str: " << str << "\t";
throw std::overflow_error(tstrerror(code));
}
}
@ -904,6 +904,12 @@ void testDecimalFromStr(std::vector<DecimalFromStrTestUnit<BitNum>>& units) {
TEST(decimal, decimalFromStr_all) {
std::vector<DecimalFromStrTestUnit<64>> units = {
{18, 18, "-0.0000000000000100000010000000900000009e10", "-0.000100000010000001", false},
{18, 18, "-0.1999999999999999999e-1", "-0.020000000000000000", false},
{18, 18, "-0.9999999999999999999e-1", "-0.100000000000000000", false},
{18, 18, "-9.999999999999999999e-1", "", true},
{10, 10, "-9.9999999e-2", "-0.0999999990", false},
{10, 6, "9.99999e4", "", true},
{18, 4, "9.999999e1", "100.0000", false},
{18, 10, "1.23456e7", "12345600.0000000000", false},
{18, 18, "0.0000000000000000000000000010000000000000000199999e26", "0.100000000000000002", false},