我已经用Java编写了这段代码:

String[] tokens = strLine.split(delims);
SimpleOrderRequest bet = new SimpleOrderRequest();
long Id = Long.parseLong(tokens[1].trim());
byte polarity =  Byte.parseByte(tokens[2].trim());
float price = Float.parseFloat(tokens[3].trim());
float stake = Float.parseFloat(tokens[4].trim());
bet.selectionId = Id;
bet.polarity = polarity;
bet.stake = new BigDecimal(stake) ;
bet.price = new BigDecimal(price) ;


其中令牌[1],令牌[2],令牌[3],令牌[4]是不同格式的数字。问题是我必须将数字切割为逗号后的第一位,以便将数据发送到wsdl服务。即,当我读取的字符串是:

0.00426,    12955094,  1,    100.,   1.
0.00050,    12954726,  1,    100.,   1.


一切正常,bet.stake = 1。和bet.price = 100。但是当字符串的形式为:

0.00154,    13189533,  1,    2.10,   34.77


然后bet.stake = 34.770000457763671875和bet.price = 2.099999904632568359375,而wsdl服务不允许我提出请求,因此我不得不减少电话数。解析数字时可以直接执行此操作吗?如果没有,我该怎么办?

最佳答案

首先,您不应该使用float表示货币值。只需使用:

BigDecimal price = new BigDecimal(tokens[3].trim());


(等等)

看来您在SimpleOrderRequest中具有正确的数据类型-那么为什么要引入二进制浮点转换?

理解二进制浮点的工作原理很重要-关于堆栈溢出的问题很多。基本上,通常应将floatdouble用于“自然”值,例如身高和体重,其中幅度固然重要,但实际上并没有精确值之类的东西,而将BigDecimal用于“人工”值,例如,您当然可以确切地拥有$ 1.10。

10-04 17:43