我已经用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
中具有正确的数据类型-那么为什么要引入二进制浮点转换?理解二进制浮点的工作原理很重要-关于堆栈溢出的问题很多。基本上,通常应将
float
和double
用于“自然”值,例如身高和体重,其中幅度固然重要,但实际上并没有精确值之类的东西,而将BigDecimal
用于“人工”值,例如,您当然可以确切地拥有$ 1.10。