【问题标题】:How to truncate the double value? [duplicate]如何截断双精度值? [复制]
【发布时间】:2013-03-04 12:33:34
【问题描述】:

我想截断双精度。

例如

double d=3.123456789087654;

如果我想将它截断到小数点后的第 10 位 结果应该是

result: 3.1234567890

结果我不需要四舍五入值

我尝试了自己的功能

     static double truncateDouble(double number, int numDigits) {
    double result = number;
    String arg = "" + number;
    int idx = arg.indexOf('.');
    if (idx!=-1) {
        if (arg.length() > idx+numDigits) {
            arg = arg.substring(0,idx+numDigits+1);
            result  = Double.parseDouble(arg);
        }
    }
    return result ;
 }

但没有得到我想要的适当结果.. 谁能帮我解决我的问题。

java是否支持这种支持截断不四舍五入的函数??

【问题讨论】:

  • 只是出于好奇,您为什么要失去精度?
  • 我站在这毫无意义的一边。除了输出数字时,您是否有在某个点舍入/截断的用例?另外,虽然我有预感 NPE 是正确的,因为“适当的”结果是一个无法准确表示的数字,但你能说出你的代码的实际问题是什么吗? IE。哪个输入的错误结果以及您的预期结果是什么?
  • @millimoose:我的问题很简单..我想在小数点后的特定 no 之后将 double
  • @krishnaChandra 不,我的意思是你最终想要完成什么。 为什么你想做这件事?也许有更好的方法来实现这一点。请记住,double 中没有“小数点后的数字”之类的东西 - 它在内存中表示为符号+尾数+指数,后者是以 2 为底的数字,而不是 10。你可以最接近没有BigDecimals 是乘以 10^digits,ceil/floor ,然后再除,最后得到什么。
  • @krishnaChandra 即使是规模有限的BigDecimals 也不是一个好的答案,因为您使用这些进行的任何和所有数学都会扭曲结果以奇怪的方式,如果你不知道舍入误差复合是什么以及它是如何工作的(我肯定不记得)以及为什么你故意在计算中引入显着的舍入误差,这可能是一个坏主意。所以我会回答“我想在计算过程中对数字进行四舍五入,我该怎么做?”是“不,你不知道,除非你能解释原因。”

标签: java


【解决方案1】:

一般来说,你不能,至少不能使用double。原因是许多数字根本无法准确表示,即使它们的小数位数很少。

以0.1为例。最接近的double 是 0.1000000000000000055511151... 再多的截断也不会给您精确的 0.1。

【讨论】:

  • yr 点是正确的,但是随着我的问题的发展..我想将其截断为指定的值。可以完成..
【解决方案2】:

您可以使用 DecimalFormat 类。

double d = 3.123456789087654;

DecimalFormat newFormat = new DecimalFormat("#.##########");
double tenDecimal =  Double.valueOf(newFormat.format(d));

这将四舍五入最后一位数字。

我同意 NPE。没有多少截断会给你正好 0.1。

唯一的方法是转换成字符串,然后子字符串转换回双精度。

【讨论】:

  • @Hemant:你是正确的,因为你在 DEciamlFormat 方法中硬编码了 # 符号,在第二次运行中,如果我想更改小数点后的截断点,那么这将不起作用,,我会明确地改变它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2019-03-13
  • 2013-01-28
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
相关资源
最近更新 更多