hibernate命名查询返回数据类型为NUMBER的列的BigDecimal.
select col1 as "col1" from table1 union select col2 as "col1" from table2
Run Code Online (Sandbox Code Playgroud)
在客户端,我希望col1的数据类型是long(原始)我这样做:
<return-scalar column="col1" type="java.lang.Long" />
Run Code Online (Sandbox Code Playgroud)
要么
<return-scalar column="col1" type="long" />
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我得到:
java.lang.ClassCastException: java.math.BigDecimal incompatible with java.lang.Long
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?我怀疑,别名有什么问题?
基本上,我很好奇如何在new BigDecimal(Double.toString(d))不经历创建字符串的过程中掌握.
在对文件Double.toString是相当复杂的(和有趣).据我了解,该方法实际上并不返回给定double实际表示的数字的字符串表示,而是唯一标识给定double的(near by)最短实数的字符串表示.
(我实际上并不需要这个.如果我这样做,我可能会通过一个字符串.我只是好奇这个算法找到这个"短"实数,唯一确定给定的双值.)
在Wicket应用程序中,我有一个十进制数字文本字段:
TextField<BigDecimal> f =
new TextField<BigDecimal>("f", new PropertyModel<BigDecimal>(model, "share"));
Run Code Online (Sandbox Code Playgroud)
我希望它始终接受两者.(点)和,(逗号)作为小数点分隔符(无论浏览器的语言环境设置如何).
为了显示该值,使用会话的语言环境[在我们的例子中强制为"fi"( - >逗号)],但在这里我对该字段接受的输入感兴趣.
我的问题是,我是否必须将字段更改为TextField<String>,并手动转换为域对象的类型(BigDecimal)?或者是否有某种使用方法TextField<BigDecimal>(允许例如使用Wicket的MinimumValidator或RangeValidator),并且仍然接受两个小数分隔符?
我想在Ruby中正确地将美分转换为美元.我将永远不必使用分数.
是否可以正确执行此操作(没有浮点错误)而不必使用BigDecimal?
例如,美分到美元
"99" => "0.99"
"324" => "3.24"
Run Code Online (Sandbox Code Playgroud)
以下似乎有效,但它是否正确?
(cents.to_i/100.0).to_s
Run Code Online (Sandbox Code Playgroud) java.math.BigDecimal.toString()可以返回类似"0.888200000"的内容.如果我想要"0.8882"而我可以做的最好的事情是什么?我永远不会知道(除非我为每个特定情况计算它)整数的长度(从左到右)部分,该值可以是123.8882,就像123456.88一样容易.
我研究过并发现,在处理货币时,最好的计算方法是BigDecimal上课.
考虑到这一点,我正在制定一个代码,将各种类型的外币兑换成美元,反之亦然(具体而言,是一种取货币并将其兑换成美元货币的现金登记,计算变更并将此金额返还给外币客户).
截至目前,许多方法都使用double,其中两个int作为参数用于计算美元.
题:
由于我想在计算中使用BigDecimal类,我是否应该将所有涉及双精度计算的方法更改为BigDecimal?
我有以下代码,它分割一串数字(用空格分隔),然后创建一个浮点数组:
//Split the string and then build a float array with the values.
String[] tabOfFloatString = value.split(" ");
int length = tabOfFloatString.length;
System.out.println("Length of float string is" + length);
float[] floatsArray = new float[length];
for (int l=0; l<length; l++) {
float res = Float.parseFloat(tabOfFloatString[l]);
System.out.println("Float is " + res);
floatsArray[l]=res;
}
Run Code Online (Sandbox Code Playgroud)
问题是字符串中的某些值是用科学记数法格式化的 - 例如它们读取-3.04567E-8.
我想要做的是最终得到一个不包含E号的浮点数.
我一直在阅读这个线程,这表明我可以使用BigDecimal,但是无法让它工作 - 这是最好的方法还是我应该尝试别的?如何在Java中将字符串3.0103E-7转换为0.00000030103?
我目前正在使用BigDecimal,它给了我更多的小数,但还不足以满足我的目的.我需要能够一直到10 ^ 6数字.这是我目前的代码
BigDecimal num = new BigDecimal(103993/33102.0);
pw.println(num.toString());
Run Code Online (Sandbox Code Playgroud)
它输出3.14159265301190249175533608649857342243194580078125
其中数字实际上有更多的小数:http://www.wolframalpha.com/input/?i = 103993%2F33102
以下程序冻结,我无法弄清楚原因.
import java.math.*;
public class BigDec {
public static BigDecimal exp(double z) {
// Find e^z = e^intPart * e^fracPart.
return new BigDecimal(Math.E).pow((int)z, MathContext.DECIMAL128).
multiply(new BigDecimal(Math.exp(z-(int)z)), MathContext.DECIMAL128);
}
public static void main(String[] args) {
// This works OK:
BigDecimal x = new BigDecimal(3E200);
System.out.println("x=" + x);
System.out.println("x.movePointRight(1)=" + x.movePointRight(1));
// This does not:
x = exp(123456789);
System.out.println("x=" + x);
System.out.println("x.movePointRight(1)=" + x.movePointRight(1)); //hangs
}
}
Run Code Online (Sandbox Code Playgroud)
出于目前的目的,第一种方法只是创建一个非常大的BigDecimal.(细节:它找到了z的力量,即使它太大而不是双倍.我很确定这种方法是正确的,尽管MathContexts可能不是最好的地方.)
我知道e ^ 123456789非常大,但我确实想要使用这样的数字.非常感谢任何答案.
在使用Java BigDecimal时,我有一个问题。当我要将100乘以BigDecimal的对象时,哪种方法会更好。
顺便说一句,它将用于商业计算,所以我考虑的是精度而不是速度。
bigdecimal ×10
java ×8
string ×2
double ×1
formatting ×1
hibernate ×1
long-integer ×1
ruby ×1
tostring ×1
wicket ×1