Oracle是否为Number数据类型存储尾随零?

时间:2017-02-13 08:01:56

标签: sql oracle

当我在表中存储数值并在SQL Developer中查询该表时,它没有显示Number数据类型的尾随零。

create table decimal_test(decimal_field number(*,10));

insert into decimal_test(decimal_field) values(10);
insert into decimal_test(decimal_field) values(10.11);
insert into decimal_test(decimal_field) values(10.100);
insert into decimal_test(decimal_field) values(10.00);

select * from decimal_test;

,结果是

10
10.11
10.1
10

这些值是从java代码处理的。在这种情况下,我使用BigDecimal来存储值。

在保存到DB之前,如果我有BigDecimal(10.00),保存后,从DB返回的值为BigDecimal(10)BigDecimal中的等于方法失败,因为比例已更改。

我的小数精度不是常数。用户可以设置BigDecimal(10.00)或BigDecimal (10.000)等。因此,值需要按原样存储在DB中。

有没有办法在oracle中存储尾随零?

3 个答案:

答案 0 :(得分:6)

尾随零的存在是显示问题,而不是存储问题。尾随零并不重要,无论如何,只要正确,数字的内部格式就不重要了。 1010.00000之间没有价值差异。

如果您需要尾随零,则在转换显示值时始终可以使用格式。例如:

System.out.printf("%10.4d\n", decimalValue);

如果问题是比例差异,您可以在比较前 比例设置为适当的值。

答案 1 :(得分:4)

如果要保留数字输入的比例(可能很重要 - 10.1的度量与度量10.100不同)将比例存储在额外栏目。

create table decimal_test
(decimal_field number(*,10),
 decimal_scale number(*,0)
);

计算输入的比例并将其存储在新列decimal_scale中。

在输出格式化中使用此值。

不建议将数字存储为字符串 - 您保留了比例但是数字验证失败并且可能会将CBO与由类型转换引起的错误估计混淆......

答案 2 :(得分:3)

10和10.00 通常相同的数字。 (如果你需要支付10美元或10.00美元甚至10.0000美元,它并没有什么区别: - )

但是,如果你想在测量中表达值的精度,那么10.00意味着你只知道最多两位小数,但实数可以是10.00001或10.009或其他什么,那么你必须添加存储此信息。一种方法是使用字符串数据类型,但是你必须坚持某种格式(' 10.00'或者说' 10,00')和不应该将它用于数据库中的计算。

另一种选择是存储数字和附加列,用于小数位数的精度,例如: value = 10 / decimal_places = 2.我希望这比存储字符串更好。