在我的应用程序中,我将数字处理为BigDecimal并将它们存储为NUMBER(15,5).现在我需要正确检查Java是否BigDecimal值适合列,以便我可以生成正确的错误消息而不执行SQL,捕获异常并验证供应商错误代码.我的数据库是Oracle 10.3,这样的错误导致错误1438.
经过一些谷歌搜索,我发现没有这样的代码,所以我想出了自己的.但是我对这段代码真的不满意......很简单,但同时又简单到足以怀疑它的正确性.我用很多值,随机和边界测试它,它似乎工作.但是由于我对数字非常不满意,我想要一些更强大且经过良好测试的代码.
//no constants for easier reading
public boolean testBigDecimal(BigDecimal value) {
if (value.scale() > 5)
return false;
else if (value.precision() - value.scale() > 15 - 5)
return false;
else
return true;
}
Run Code Online (Sandbox Code Playgroud)
编辑:最近的测试没有超出规模的数字的例外,只是默默地舍入,我不知道没有和我做这些第一次测试之间有什么不同.这样的舍入是不可接受的,因为应用程序是财务的,并且任何舍入/截断必须是显式的(通过BigDecimal方法).除了例外之外,这种测试方法必须确保数字对于期望的精度而言不是太大,即使是非有效数字.对于迟到的澄清感到抱歉.
谢谢你的时间.
我仍然对这个问题感到好奇.我的代码仍在运行,我没有得到正确或失败情况的一些"证据",或者这种测试的一些标准代码.
所以,我正在给它一个赏金,希望得到任何这些.
什么是Scala与C#的类比decimal?我应该使用java.math.BigDecimal还是Scala中有自己的标准类型?
我正在使用Hibernate作为我们的对象关系映射,使用一个隐藏数据库的自定义方言.
我从这个数据库中检索的实体有一列:
@Column(name = "GROSS_WEIGHT", precision = 9, scale = 3)
private BigDecimal grossWeight;
Run Code Online (Sandbox Code Playgroud)
数据库将此列定义为数字,精度为9,标度为3.
我可以看到Hibernate生成的SQL来检索数据,当我使用数据库查询工具执行相同的Query时,它会返回GROSS_WEIGHT列的"9.68".
但是,在由Hibernate检索的实体中,'grossWeight'字段包含值'10',其中scale0和precision2 为0 !
在我正在使用的自定义方言类中,我尝试重写以下列类型:
registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
registerColumnType( Types.DOUBLE, "numeric($p,$s)" );
registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
Run Code Online (Sandbox Code Playgroud)
但它仍然只返回(舍入的)整数.
这在我们使用Postgres方言从Postgres检索对象的应用程序的其他地方有效.
知道我应该在方言中做什么,所以我可以让Hibernate正确设置检索到的BigDecimal的精度/比例?
我正在做一个问题,我必须在数字
[4 + sqrt(11)] n的小数点前找到最后两位数.
例如,当 n = 4时,[4 + sqrt(11)] 4 = 2865.78190 ......答案是65.其中n可以从2 <= n <= 10 9变化.
我的解决方案 - 我试图构建一个平方根函数,它计算11的sqrt,其精度等于用户输入的n的值.
我BigDecimal在Java中使用过以避免溢出问题.
public class MathGenius {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
long a = 0;
try {
a = reader.nextInt();
} catch (Exception e) {
System.out.println("Please enter a integer value");
System.exit(0);
}
// Setting precision for square root 0f 11. str contain string like 0.00001
StringBuffer str …Run Code Online (Sandbox Code Playgroud) 我有BiGDecimal price,我需要检查它是否在某个范围内.例如应该是3个条件:
if (price >= 0 and price <=500) {
....
} else if (price >=500 && price <=1000) {
....
} else if (price > 1000) {
....
}
Run Code Online (Sandbox Code Playgroud)
如何使用BigDecimal类型正确执行.
我在代码中遇到了奇怪的错误.
它涉及到
new BigDecimal("1.2300").stripTrailingZeros()
Run Code Online (Sandbox Code Playgroud)
返回1.23(正确)
但
new BigDecimal("0.0000").stripTrailingZeros()
Run Code Online (Sandbox Code Playgroud)
返回0.0000(奇怪),因此没有任何反应
为什么?
怎么解决?
我有一些BigDecimal值,应该为搜索索引.Lucene有NumericField,但它只有long,double,float和int的setter.我可以将它存储为String但我不会受益于NumericRangeQuery.
你如何存储你的BigDecimals?分享的最佳做法是什么?
我正在寻找Delphi Data.FmtBcd库的替代品,因为我只是达到它可以表示的最大十进制数字的限制,并且程序终止于EBcdOverflowException.对于好奇,我正在计算算术系列成员,需要处理非常大的数字 - 数十万个位置并不是那么罕见.并在合理的时间内获得结果.我确实将部分代码重写为Python 3.2用于测试目的,并且计算速度足以满足Delphi的要求.
有关此类库的一些建议,最好是免费还是开源?
我有一个简单的BigDecimal,我想为另一个BigDecimal供电,例如11.11 ^ -1.54.在Java/Android中最好的方法是什么?我不喜欢转换为双打的想法,因为它是用于医疗应用,所以我很欣赏最大的可能性.到目前为止,我已经查看了来自Google Guava的http://commons.apache.org/math/和数学内容,但一无所获.
编辑:整个计算很复杂,并且有很多这样的操作.我需要尽可能多的精度.
-:total_cost_with_tax => #<BigDecimal:7fda9d17aaf0,'0.105225E4',18(45)>,
-:total_cost_without_tax => #<BigDecimal:7fda9d17b450,'0.972E3',9(36)>,
-:total_last_installment_amount => #<BigDecimal:7fda9d17b978,'0.8011E2',18(45)>,
-:total_monthly_installment_amount => #<BigDecimal:7fda9d17abb8,'0.8011E2',18(45)>,
-:total_tax => #<BigDecimal:7fda9d17b068,'0.8025E2',18(45)>,
+:total_cost_with_tax => #<BigDecimal:7fda9d0184c8,'0.105225E4',18(36)>,
+:total_cost_without_tax => #<BigDecimal:7fda91ff2b48,'0.972E3',9(27)>,
+:total_last_installment_amount => #<BigDecimal:7fda91fee548,'0.8011E2',18(36)>,
+:total_monthly_installment_amount => #<BigDecimal:7fda91fe72c0,'0.8011E2',18(36)>,
+:total_tax => #<BigDecimal:7fda9d00a2b0,'0.8025E2',18(36)>,
Run Code Online (Sandbox Code Playgroud)
因此,在我的一些测试中,这些都是散落的...... rspec 2,rails 3.我正在比较使用的哈希进行.should eq()比较.我似乎无法使咒语正确.看起来它是一个精确的东西,这似乎很傻.