java中的固定格式数字。(如何削减数字?)

java中的固定格式数字。(如何削减数字?),java,Java,我用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())

我用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. 
一切正常,下注。赌注=1。和打赌。价格=100。但当字符串的形式为:

0.00154,    13189533,  1,    2.10,   34.77

然后bet.stake=34.77000457763671875和bet.price=2.09999094632568359375,wsdl服务不允许我提出请求,所以我必须减少数量。我可以在解析数字时直接执行此操作吗?如果没有,我必须做什么?

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

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

看起来您在
SimpleOrderRequest
中找到了正确的数据类型-那么为什么要引入二进制浮点转换呢


了解二进制浮点是如何工作的很重要——关于它的堆栈溢出有很多问题。基本上,对于“自然”值,例如身高和体重,通常应该使用
float
double
,其中大小很重要,但实际上没有精确的值,而对于“人造”则应该使用
bigdecim
例如,您肯定可以精确获得$1.10的值。

通常,我建议在使用
String.format
打印数字时进行舍入,并在此之前以更高的精度处理数据。但由于存根接受大小数,因此必须使用:


(您还应该注意Jon Skeet的建议,在整个过程中使用
BigDecimal
s,并在完成任何计算后进行舍入。)

我试图想象为什么有人会制作一个接受十进制数的WSDL(我假设您的存根使用
BigDecimals
),然后拒绝大多数十进制数。始终使用BigDecimal的字符串参数构造函数进行初始化values@Barun:嗯,不一定总是,但通常是。
bet.price = new BigDecimal(tokens[3].trim()).setScale(1, RoundingMode.HALF_EVEN);