我用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) ;
其中 tokens[1],tokens[2],tokens[3],tokens[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
中获得了正确的数据类型 - 那么为什么要引入二进制浮点转换?
了解二进制浮点的工作原理非常重要 - Stack Overflow 上有无数关于它的问题。基本上,您通常应该使用 float
和 double
来表示“自然”值,例如高度和体重,其中大小很重要,但实际上不存在精确值 - 并且使用 BigDecimal
作为“人工”值,例如,您肯定可以得到精确 $1.10 美元。
关于java - java中的固定格式数字。 (如何剪号?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117899/