繁体   English   中英

四舍五入到三位有效数字

Round a double to 3 significant figures

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

有谁知道我如何将双值四舍五入到 3 个有效数字,例如本网站上的示例

http://www.purplemath.com/modules/rounding2.htm

7 个回复
double d = ...;
BigDecimal bd = new BigDecimal(d);
bd = bd.round(new MathContext(3));
double rounded = bd.doubleValue();
    public String toSignificantFiguresString(BigDecimal bd, int significantFigures ){
    String test = String.format("%."+significantFigures+"G", bd);
    if (test.contains("E+")){
        test = String.format(Locale.US, "%.0f", Double.valueOf(String.format("%."+significantFigures+"G", bd)));
    }
    return test;
}

如果您想手动操作:

import java.lang.Math;

public class SigDig {

  public static void main(String[] args) {
    System.out.println("   -123.456   rounded up   to 2 sig figures is " + sigDigRounder(-123.456, 2,  1));
    System.out.println("     -0.03394 rounded down to 3 sig figures is " + sigDigRounder(-0.03394, 3, -1));
    System.out.println("    474       rounded up   to 2 sig figures is " + sigDigRounder(474, 2,  1));
    System.out.println("3004001       rounded down to 4 sig figures is " + sigDigRounder(3004001, 4, -1));
  }

  public static double sigDigRounder(double value, int nSigDig, int dir) {

    double intermediate = value/Math.pow(10,Math.floor(Math.log10(Math.abs(value)))-(nSigDig-1));

    if(dir > 0)      intermediate = Math.ceil(intermediate);
    else if (dir< 0) intermediate = Math.floor(intermediate);
    else             intermediate = Math.round(intermediate);

    double result = intermediate * Math.pow(10,Math.floor(Math.log10(Math.abs(value)))-(nSigDig-1));

    return(result);

  }
}

上面的方法将双精度数四舍五入到所需的有效数字,处理负数,并且可以明确告知要向上或向下取整

Sean Owen( https://stackoverflow.com/a/7548871/274677 )给出的答案没有错。 但是,根据您的用例,您可能需要使用String表示形式。 在这种情况下,IMO最好仍在BigDecimal空间中使用以下方法进行转换:

bd.toPlainString();

...如果这是您的用例,那么您可能会感到沮丧,根据Owen的答案改编的代码将产生以下内容:

d = 0.99, significantDigits = 3 ==> 0.99

...而不是严格更精确的0.990

如果这些事情在您的用例中很重要,那么我建议对Owen的答案进行以下修改; 您显然也可以返回BigDecimal本身,而不用调用toPlainString() -我只是通过这种方式提供完整性。

public static String setSignificanDigits(double value, int significantDigits) {
    if (significantDigits < 0) throw new IllegalArgumentException();

    // this is more precise than simply doing "new BigDecimal(value);"
    BigDecimal bd = new BigDecimal(value, MathContext.DECIMAL64);
    bd = bd.round(new MathContext(significantDigits, RoundingMode.HALF_UP));
    final int precision = bd.precision();
    if (precision < significantDigits)
    bd = bd.setScale(bd.scale() + (significantDigits-precision));
    return bd.toPlainString();
}    

双 d=3.142568; System.out.printf("答案:%.3f", d);

如何将双精度值四舍五入为3个有效数字

你不能 双打以二进制表示。 它们没有四舍五入的小数位。 获得特定数量的小数位数的唯一方法是将其转换为小数基数并将其保留在该位置。 一旦将其转换回两倍,就再次失去了小数精度。

对于所有在此处和其他位置转换为其他基数或返回或除以10的乘方的风扇,请显示所得的双精度值%0.001或所需的精度要求,并说明结果。

编辑:具体来说,那些技术的支持者需要解释以下代码的92%失败率:

public class RoundingCounterExample
{
    static float roundOff(float x, int position)
    {
        float a = x;
        double temp = Math.pow(10.0, position);
        a *= temp;
        a = Math.round(a);
        return (a / (float)temp);
    }

    public static void main(String[] args)
    {
        float a = roundOff(0.0009434f,3);
        System.out.println("a="+a+" (a % .0001)="+(a % 0.001));
        int count = 0, errors = 0;
        for (double x = 0.0; x < 1; x += 0.0001)
        {
            count++;
            double d = x;
            int scale = 2;
            double factor = Math.pow(10, scale);
            d = Math.round(d * factor) / factor;
            if ((d % 0.01) != 0.0)
            {
                System.out.println(d + " " + (d % 0.01));
                errors++;
            }
        }
        System.out.println(count + " trials " + errors + " errors");
    }
}

我通常不对数字本身进行四舍五入,而是在需要显示数字时对数字的String表示进行四舍五入,因为通常是重要的显示,需要四舍五入(尽管在某些情况下(可能在您的情况下可能不是这样),但是如果需要,您需要对此进行详细说明)。 这样,我的电话号码便保持其准确性,但其显示却简化了并且更易于阅读。 为此,可以使用DecimalFormat对象,例如以“ 0.000”字符串( new DecimalFormat("0.000")String.format("%.3f", myDouble) ,或者使用String.format("%.3f", myDouble)或其他几种方式。

例如:

// yeah, I know this is just Math.PI.
double myDouble = 3.141592653589793;
DecimalFormat myFormat = new DecimalFormat("0.000");
String myDoubleString = myFormat.format(myDouble);
System.out.println("My number is: " + myDoubleString);

// or you can use printf which works like String.format:
System.out.printf("My number is: %.3f%n", myDouble);
1 指定Django DecimalField的有效位数

Django 文档很清楚,DecimalFields是基于Python 十进制模块的固定精度十进制数字。 如果我已有12位有效数字的数据,该如何对其建模? 例如,这是感兴趣的数据的示例: 一些条目只有6个小数,而其他条目则有9或10个小数。由于这只是数据集中的一个样本,因此可 ...

2 计算有效位数

我需要将任何浮点数转换为5位有效数字格式。 它表示五个第一个非零数字(最后一个数字未向上舍入)。 例 对我来说这种方法的问题是3852.574257425742694四舍五入为3852.6,我需要3852.5。 ...

2017-08-22 15:59:02 1 309   ruby
3 读取.png的有效位数?

我有一组用LabVIEW记录的16位png文件。 由于某些原因,我需要对它们进行位移位才能使用它们。 为此,我需要有效位数。 如何使用Python阅读这些内容? 在Matlab中,有一种称为imfinfo的方法,该方法返回有效位。 ...

5 浮点类型的有效位数

C中类型float的描述提到有效位数是6 。 然而, 然后使用printf()打印它不打印12345.6 ,它打印12345.599609 。 那么对于浮点类型,“6位有效数字”(或“ double情况下为15”)意味着什么呢? ...

6 四舍五入到Postgres中的有效位数

是否可以将double precision数字四舍五入到postgres中的给定有效位数? 我想尽可能地重现R函数的signif 。 特别是,我希望结果符合格式和舍入规则的IEEE 754浮点标准。 使用to_char似乎有可能: http : //www.postgresql.o ...

7 在Python中如何找到最低有效位数

我正在寻找一种希望找到的简单方法,即数字中的最低有效数字(浮点数或整数)。 例如: 101-&gt; 1 101.2-&gt; 0.2 1.1003-&gt; 0.0003 诸如10、100、1000之类的案例的相关性稍差一些,尽管无论如何我都会对此感兴趣 ...

8 找到C#decimal的最低有效位数

我想找到C# decimal的最低有效位数,并在该位置设置1,在所有其他位置设置为零。 因此,例如对于2米,结果将是1米。 对于34米,结果将是1米。 对于0.4米,它将返回0.1米。 对于1200米,我想要100米。 我该怎么做呢? 我可以使用类似于https://st ...

9 R:选择列表的有效位数

我想将清单中的所有数字四舍五入到4位有效数字; 但是,使用signif并不能解决问题。 我可以unlist但我想将3个向量的结构保留在列表中。 是否可以解决此问题而无需先转换signif(v1, 4), signif(v2, 4) ... ? ...

2017-07-17 03:29:34 0 60   r/ list
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM