当前位置: 首页 > 面试题库 >

数据类型来表示Java中的大十进制

郦祺
2023-03-14
问题内容

哪种数据类型倾向于代表十进制数字,例如“ 10364055.81”。

如果尝试使用double:

double d = 10364055.81;

但是,当我尝试打印该数字时,它会显示为“ 1.036405581E7 ”,这是我不想要的。

我应该使用BigDecimal吗?但其显示为 10364055.81000000052154064178466796875
。是否有任何数据类型按原样显示值?同样,该数字可能大于示例中的数字。

顺便说一句,使用BigDecimal会影响应用程序的性能吗? 我可能会在几乎所有的DTO中使用它。


问题答案:

您应该使用BigDecimal-但 使用String构造函数 ,例如:

new BigDecimal("10364055.81");

如果将a传递double给BigDecimal,则Java必须首先创建该double,并且因为double无法准确表示大多数十进制小数,因此它
创建as值10364055.81000000052154064178466796875然后
将其传递给BigDecimal构造函数。在这种情况下,BigDecimal无法知道您实际上是指舍入器版本。

一般来说,使用BigDecimal的非String构造函数应被视为警告,提示您没有充分利用该类的优点。

编辑
-基于完全重读您想做的事情,我的最初主张可能太强了。当您需要精确表示十进制值时,BigDecimal是一个不错的选择(例如,货币处理是显而易见的选择,例如,您不希望5.99
*一百万5990016.45

但是,如果你不担心次数存储 在内部
是一个非常略有不同的价值,文字输入的小数,只是想以相同的格式再打印出来,然后根据其他人所说,实例NumberFormat(在在这种情况下,new DecimalFormat("########.##"))将可以很好地输出double值,否则String.format可以完成很多操作。

至于性能-
BigDecimals自然会比使用基元慢。不过,通常情况下,除非程序的绝大多数都涉及数学运算,否则您不太可能真正注意到任何速度差异。这并不是说您应该全部使用BigDecimals;但是,相反,如果您可以从纯功能很难或不可能实现的功能中获得真正的收益doubles,那么就不要在理论上引入微小的性能差异。



 类似资料:
  • 在我的C++程序中,有没有方法使用十进制数据类型,如、或?

  • 我有几个表存储了相当大的数字,因此我选择作为所有列的数据类型。 架构示例: Table1(value1,value2,value3,value4,value5) Table2(value1,value2,value3,value4,value5)

  • 问题内容: 如果我在使用中计算2之间的差异: 然后我得到一个输出,其中包含年,月,日的数量,例如: 有谁知道一种干净的方式将其表示为十进制类型的值(即,在上面会出现)? 问题答案: 我会避免使用“期间”,而只是计算天数之差:

  • 问题内容: 在 MySQL 中使用浮点数和十进制数据类型有什么区别?。 我什么时候应该使用哪个? 问题答案: 这是我在有这个疑问时发现的。 小数点在这种情况下完成了应该做的事情,它截断了其余部分,从而失去了 1/3 部分。 所以对于总和,小数更好,但对于除法,浮点数更好,当然,在某种程度上。我的意思是,使用 DECIMAL 不会以任何方式为您提供“失败证明算法”。 希望这可以帮助。

  • 对于工作计划应用程序,我需要为w周(=7w天)生成许多可能的员工计划。员工时间表由计划期内每天的班次(早班、晚班、夜班、Rest日)列表组成。应用程序是用Java编程的。 此时,我代表员工时间表如下: 移位是表示分配移位的枚举,定义为: 我在枚举声明和方法中也有一些shift属性来比较属性,但我认为这与此无关。 每个员工都有一份他可能的时间表列表: 我的问题是,我实际上有50名员工,我想为每个员工

  • 问题内容: 当我在MySQL中使用浮点和十进制数据类型时,它有什么区别? 我什么时候应该使用哪个? 问题答案: 这是我对此有疑问时发现的。 十进制完全符合这种情况下的预期,截断了其余部分,从而丢失了1/3的部分。 因此对于总和,小数点更好,但是对于除数,浮点数更好,当然到了某种程度。我的意思是,使用DECIMAL不会以任何方式为您提供“防故障算法”。 希望这可以帮助。