Java : How to count the number of decimals contained in a double value that represent money?

标签 java string double currency scientific-notation

对于一个用 Java 制作的更改应用程序,我在计算 double 值的小数位数时遇到了问题。

double 值代表钱,所以我的所有操作都必须在对原始值进行操作后将像 12.58 这样的 double 值存储为 12.5797886 的结果进行。为了抵消这种影响,我选择使用 String,就像这样:

String amountString = String.valueOf(amount);
String decimals = amountString.substring(amountString.indexOf('.') + 1);

所以如果数量是 12.58,我得到 58 而不是 57978...

我的问题是关于大金额,就像 12849561476651.2501535 这样的金额在以 double 形式存储时转换为科学计数法。所以金额的双倍值为 1.284956147665125E13

不幸的是,我不能只计算点后面的数字并取位置 13 之后的所有内容。在这种情况下,原始小数 2501535 在第三个位置包含 0,位置 13 之后的结果四舍五入为 25。

我为那些想要在没有科学记数法的情况下打印十进制值的人找到了一些解决方案,他们使用 .printf( %f , ... ) 或类似的东西。

但是,如果可能的话,我如何计算一个 double 值中包含的小数位数并处理存储问题和科学记数法?

我必须能够知道是否有超过 2 位小数。此外,如果您有一个非常高效的解决方案,即使它是一个复杂或奇怪的解决方案,也会很棒。

谢谢

最佳答案

不要使用 double 或 float 来存储货币,或存储任何需要精确的小数,因为 double 和 float 可能不准确。

您可以使用 BigDecimal 或者使用 int 或 long 并自己记录小数点。

有关这方面的更多信息,请参阅 Joshua Bloch 的 Effective Java 中的“第 60 条:如果需要精确答案,请避免使用 float 和 double”部分:https://kea.nu/files/textbooks/new/Effective%20Java%20%282017%2C%20Addison-Wesley%29.pdf

关于Java : How to count the number of decimals contained in a double value that represent money?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29080804/

相关文章:

c++ - C++中双数的总和

c++ - 从字符串到 double 的转换 - 可能性和错误

java - 无法将临时 .csv 文件写入 Android 缓存

java - com.stripe.exception.InvalidRequestException : Missing required param: amount. ;请求 ID : req_6mshZrGwQeiE8c?

string - 如何通过迭代地从字符串中删除所有出现的某些指定单词来最小化字符串的长度

c# - 用另一个替换字符串的一部分

java - 在 Java Servlet 中为 Double 赋值时出错

java - 由于带有操作栏 sherlock 的 Robotium 测试项目中的 'java.lang.IllegalAccessError',仪器运行失败

java - 使用 BC key 或默认 key 有什么区别?

C: STRTOK 异常