当我在表中存储数值并在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中存储尾随零?
答案 0 :(得分:6)
尾随零的存在是显示问题,而不是存储问题。尾随零并不重要,无论如何,只要值正确,数字的内部格式就不重要了。 10
和10.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.我希望这比存储字符串更好。