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());
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 上有无数关于它的问题。基本上,您通常应该使用 floatdouble 来表示“自然”值,例如高度和体重,其中大小很重要,但实际上不存在精确值 - 并且使用 BigDecimal 作为“人工”值,例如,您肯定可以得到精确 $1.10 美元。

关于java - java中的固定格式数字。 (如何剪号?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117899/

相关文章:

java - Selenium 在 td 中搜索文本并获取同一行的另一个 td

java - 为什么 JFrame 对象似乎保持 Activity 状态,即使没有对它的引用?

java - 空 Java 泛型

java:for循环内的最大执行时间

java - SSLException : Connection has been shutdown:Operation timed out,

java - 什么时候应该使用 InputStreamReader 和 OutputStreamWriter?

java - 是否可以使用 HEAD 请求获取分块编码文件的长度?

java - 使用 Java 将 .webp 转换为 .jpeg

java - 在eclipse插件中启动java程序失败

java - java中将字符串分配给变量和直接使用引号之间的内存分配差异