我需要使用BigDecimal进行大量操作,我发现必须表达
Double a = b - c * d; //natural way
Run Code Online (Sandbox Code Playgroud)
如
BigDecimal a = b.subtract(c.multiply(d))//BigDecimal way
Run Code Online (Sandbox Code Playgroud)
不仅丑陋,而且是我和业务分析师之间的错误和沟通问题的根源.他们完全能够用双打读取代码,但现在他们不能.
当然一个完美的解决方案将是java支持运算符重载,但由于这不会发生,我正在寻找一个eclipse插件甚至是一个外部工具,可以从"自然方式"自动转换为"bigdecimal方式".
我不是试图预处理源代码或动态翻译或任何复杂的事情,我只是想要一些我可以输入文本和获取文本,并在源代码中保持"自然方式"作为注释.
PS:我发现这个令人难以置信的智能黑客,但我不想开始进行字节码操作.也许我可以用它来创建一个Natural2BigDecimal翻译器,但如果有人已经做过这样的工具,我不想重新发明轮子.
我不想切换到Scala/Groovy/JavaScript,我也不能,公司规则禁止在服务器端代码中使用java.
哪一个是比较Java中BigDecimal和int的最佳方法:将BigDecimal转换为int或将int转换为BigDecimal?
我试图将浮点数舍入到2位小数.
我有2个浮动值:
1.985
29.294998
Run Code Online (Sandbox Code Playgroud)
它们都需要四舍五入,所以我最终得到以下内容:
1.99
29.30
Run Code Online (Sandbox Code Playgroud)
当我使用以下方法时:
public static Float precision(int decimalPlace, Float d) {
BigDecimal bd = new BigDecimal(Float.toString(d));
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
return bd.floatValue();
}
Run Code Online (Sandbox Code Playgroud)
结果是:
1.99
29.29
Run Code Online (Sandbox Code Playgroud) BigDecimal的equals()方法也比较比例,所以
new BigDecimal("0.2").equals(new BigDecimal("0.20")) // false
Run Code Online (Sandbox Code Playgroud)
有人质疑它为何如此行事.
现在,假设我有一个Set<BigDecimal>,如何检查0.2是否在该集合中,是否独立?
Set<BigDecimal> set = new HashSet<>();
set.add(new BigDecimal("0.20"));
...
if (set.contains(new BigDecimal("0.2")) { // Returns false, but should return true
...
}
Run Code Online (Sandbox Code Playgroud) 我对如何写一个简单的模数比较if语句感到困惑.我基本上只想检查当x是BigDecimal时x是20的倍数.谢谢!
我正在调用truncate方法来截断double值,以便在十进制之后应该有一个数字(没有四舍五入),
For Ex.truncate(123.48574) = 123.4.
我的截断方法是这样的
public double truncate (double x) {
long y = (long) (x * 10);
double z = (double) (y / 10);
return z;
}
Run Code Online (Sandbox Code Playgroud)
除了这个奇怪的输出外,几乎所有的值都能正常工作.
double d = 0.787456;
d = truncate(d + 0.1); //gives 0.8 as expected. Okay.
Run Code Online (Sandbox Code Playgroud)
但,
double d = 0.7;
d = truncate(d + 0.1); //should also give 0.8. But its giving 0.7 only.
//Strange I don't know why?
Run Code Online (Sandbox Code Playgroud)
事实上它适用于所有其他0.1,0.2,0.3,0.4,0.5,0.6, - ,0.8,0.9
我的意思,例如,
double d = 0.8;
d = …Run Code Online (Sandbox Code Playgroud) 在编写一个带有表示为BigDecimal的值的测试时,我遇到了一些奇怪的东西并决定深入研究它.简而言之,当舍入到两位小数时,'0.00009'将返回0.01而不是0.00.真.这是我的脚本/控制台捕获:
>> bp = BigDecimal('0.09')
=> #<BigDecimal:210fe08,'0.9E-1',4(8)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.09
>> bp = BigDecimal('0.009')
=> #<BigDecimal:210bcf4,'0.9E-2',4(8)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.01
>> bp = BigDecimal('0.0009')
=> #<BigDecimal:2107a8c,'0.9E-3',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.0
>> bp = BigDecimal('0.00009')
=> #<BigDecimal:2103428,'0.9E-4',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.01
>> bp = BigDecimal('0.000009')
=> #<BigDecimal:20ff0f8,'0.9E-5',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.0
Run Code Online (Sandbox Code Playgroud)
哦,如果我使用默认模式,我会得到相同的结果,如下所示:
>> bd = BigDecimal('0.00009')
=> #<BigDecimal:2152ed8,'0.9E-4',4(12)>
>> bd.round(2).to_f
=> 0.01
Run Code Online (Sandbox Code Playgroud)
这是我的版本:
ruby 1.8.6 (2008-03-03 patchlevel 114) [i686-darwin9.2.2]
Rails 2.3.4
Run Code Online (Sandbox Code Playgroud)
有没有人见过这样的东西?
我有一个Get API返回一个JSON. 预期的格式是:
{
"value1": "123.00",
"value2": "23.00"
}
Run Code Online (Sandbox Code Playgroud)
这些值位于BigDecimal对象中:
public class Result{
BigDecimal value1;
BigDecimal value2;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
现在,当发出请求时,我创建Result对象并将这些值填充为BigDecimal,创建一个列表并返回。我收到的回复是:
{
"value1": 123.00,
"value2": 23.00
}
Run Code Online (Sandbox Code Playgroud)
这些值是正确的,但不是字符串。我怎样才能把它们做成绳子?
我知道我们可以转换BigDecimal为,String但我只有 BigDecimal 字段的对象,并且无法向其填充 String 值。
最后,列表是这样制作的:
List<MyObj> obj = Arrays.stream(myObj).collect(Collectors.toList());
Result result = new Result();
obj.forEach(t -> t.mergeToResult(result)); // mergeToResults does all the population like result.setValue1(new BigDecimal(123.00))
return result;
Run Code Online (Sandbox Code Playgroud) 从最近开始,(我认为是因为我将代码转换为 kotlin,但不确定),Android Studio 在我编写时向我显示警告
if (myValue.compareTo(BigDecimal.ZERO) > 0)
Run Code Online (Sandbox Code Playgroud)
该消息显示“调用可替换为二元运算符”并将我的代码替换为
if (myValue > BigDecimal.ZERO)
Run Code Online (Sandbox Code Playgroud)
我注意到我也使用
if (myValue.compareTo(BigDecimal.ZERO) == 0
Run Code Online (Sandbox Code Playgroud)
但这一次我没有收到任何警告,如果我尝试更换它,它不起作用
if (myValue == BigDecimal.ZERO) // DOES NOT WORK
Run Code Online (Sandbox Code Playgroud)
为什么> ZERO有效但无效== ZERO?为什么我在 stackoverflow 上看到的每个线程(例如this)都推荐使用compareTobut > ZEROwork 并且是 Android Studio 推荐的?