`

double精确位数摘录

    博客分类:
  • JAVA
 
阅读更多

突然需要对double的数字做精确记录,go之发现网上给出了很好的答案,故摘录在此,谢谢网上的各处答疑。

 

出自如下2处 :

1: http://topic.csdn.net/t/20030318/12/1544852.html

2: http://bbs.chinaunix.net/viewthread.php?tid=723528

 

一:利用NumberFormat

 

import   java.text.*; 
public   class   Test{ 
    public   static   void   main(String[]args){ 
        float   value=1.23456789f; 
        NumberFormat   numFormat   =    NumberFormat.getNumberInstance(); 
        numFormat.setMaximumFractionDigits(2); 
        String   str   =   numFormat.format(value); 
        System.out.println(str); 
    } 
}

 说明下,默认的是会做四舍五入了。例如1.236 取2位得到的是 1.24 ,如果取0 则默认是取整操作了,另外传递负数也是取整,因为max(0,value)

 

二:利用BigDecimal

import   java.math.BigDecimal; 

String   str   =   String.valueOf((new   BigDecimal(1.234567)).setScale(2,BigDecimal.ROUND_HALF_UP));

  BigDecimal提供了如下几种round modes

 

    // Rounding Modes

    /**
     * Rounding mode to round away from zero.  Always increments the
     * digit prior to a nonzero discarded fraction.  Note that this rounding
     * mode never decreases the magnitude of the calculated value.
     */
    public final static int ROUND_UP =           0;

    /**
     * Rounding mode to round towards zero.  Never increments the digit
     * prior to a discarded fraction (i.e., truncates).  Note that this
     * rounding mode never increases the magnitude of the calculated value.
     */
    public final static int ROUND_DOWN =         1;

    /**
     * Rounding mode to round towards positive infinity.  If the
     * {@code BigDecimal} is positive, behaves as for
     * {@code ROUND_UP}; if negative, behaves as for
     * {@code ROUND_DOWN}.  Note that this rounding mode never
     * decreases the calculated value.
     */
    public final static int ROUND_CEILING =      2;

    /**
     * Rounding mode to round towards negative infinity.  If the
     * {@code BigDecimal} is positive, behave as for
     * {@code ROUND_DOWN}; if negative, behave as for
     * {@code ROUND_UP}.  Note that this rounding mode never
     * increases the calculated value.
     */
    public final static int ROUND_FLOOR =        3;

    /**
     * Rounding mode to round towards {@literal "nearest neighbor"}
     * unless both neighbors are equidistant, in which case round up.
     * Behaves as for {@code ROUND_UP} if the discarded fraction is
     * ≥ 0.5; otherwise, behaves as for {@code ROUND_DOWN}.  Note
     * that this is the rounding mode that most of us were taught in
     * grade school.
     */
    public final static int ROUND_HALF_UP =      4;

    /**
     * Rounding mode to round towards {@literal "nearest neighbor"}
     * unless both neighbors are equidistant, in which case round
     * down.  Behaves as for {@code ROUND_UP} if the discarded
     * fraction is {@literal >} 0.5; otherwise, behaves as for
     * {@code ROUND_DOWN}.
     */
    public final static int ROUND_HALF_DOWN =    5;

    /**
     * Rounding mode to round towards the {@literal "nearest neighbor"}
     * unless both neighbors are equidistant, in which case, round
     * towards the even neighbor.  Behaves as for
     * {@code ROUND_HALF_UP} if the digit to the left of the
     * discarded fraction is odd; behaves as for
     * {@code ROUND_HALF_DOWN} if it's even.  Note that this is the
     * rounding mode that minimizes cumulative error when applied
     * repeatedly over a sequence of calculations.
     */
    public final static int ROUND_HALF_EVEN =    6;

    /**
     * Rounding mode to assert that the requested operation has an exact
     * result, hence no rounding is necessary.  If this rounding mode is
     * specified on an operation that yields an inexact result, an
     * {@code ArithmeticException} is thrown.
     */
    public final static int ROUND_UNNECESSARY =  7;

 

三 :利用DecimalFormat

 

通过使用java.text package包中提供的类型,将数字类型装换成指定的格式。

http://www.javaalmanac.com/egs/index.html


// The 0 symbol shows a digit or 0 if no digit present
    NumberFormat formatter = new DecimalFormat("000000");
    String s = formatter.format(-1234.567);  // -001235
    // notice that the number was rounded up
    
    // The # symbol shows a digit or nothing if no digit present
    formatter = new DecimalFormat("##");
    s = formatter.format(-1234.567);         // -1235
    s = formatter.format(0);                 // 0
    formatter = new DecimalFormat("##00");
    s = formatter.format(0);                 // 00
    
    
    // The . symbol indicates the decimal point
    formatter = new DecimalFormat(".00");
    s = formatter.format(-.567);             // -.57
    formatter = new DecimalFormat("0.00");
    s = formatter.format(-.567);             // -0.57
    formatter = new DecimalFormat("#.#");
    s = formatter.format(-1234.567);         // -1234.6
    formatter = new DecimalFormat("#.######");
    s = formatter.format(-1234.567);         // -1234.567
    formatter = new DecimalFormat(".######");
    s = formatter.format(-1234.567);         // -1234.567
    formatter = new DecimalFormat("#.000000");
    s = formatter.format(-1234.567);         // -1234.567000
    
    
    // The , symbol is used to group numbers
    formatter = new DecimalFormat("#,###,###");
    s = formatter.format(-1234.567);         // -1,235
    s = formatter.format(-1234567.890);      // -1,234,568
    
    // The ; symbol is used to specify an alternate pattern for negative values
    formatter = new DecimalFormat("#;(#)");
    s = formatter.format(-1234.567);         // (1235)
    
    // The ' symbol is used to quote literal symbols
    formatter = new DecimalFormat("'#'#");
    s = formatter.format(-1234.567);         // -#1235
    formatter = new DecimalFormat("'abc'#");
    s = formatter.format(-1234.567);         // -abc1235 

 

再次对网上各位答仁表示感谢。

分享到:
评论

相关推荐

    java数学计算工具类 double精确的加法算法 double精确的减法算法

    java数学计算工具类 double精确的加法算法 double精确的减法算法 精确的乘法算法 对精确的除法运算,当发生除不尽的 保留小数、数值精度

    Double类型精确计算

    Double类型精确计算,加法,减肥,乘除

    C# Double保留小数点后面位数

    本文将围绕“C# Double保留小数点后面位数”这一主题展开详细讨论,包括如何利用`Double`类型的数据以及如何通过字符串格式化来实现这一功能。 ### C#中的Double类型 在C#中,`Double`是一种基本数据类型,用于...

    Java Double 精度问题总结

    虽然 `double` 提供了相对较高的精度,但在涉及精确数学运算(特别是涉及到小数值)时,由于其内部采用二进制浮点数格式存储,仍会出现精度丢失的情况。这种精度丢失的现象对于需要高精度计算的应用来说是一个常见的...

    double保留小数

    本文将详细介绍如何在Java中使用`BigDecimal`类来实现`double`类型数值保留指定小数位数的方法。 #### 二、基础知识 1. **BigDecimal类简介**: - `BigDecimal`是Java中用来处理任意精度的十进制数的一个类。 - ...

    double类型,精确的数据运算

    描述中提到,“可自己确定精确位数”,这意味着这个类包可能允许用户自定义数值的精度,比如需要多少位小数,或者能处理多大的数值范围。这样的灵活性使得用户可以根据实际需求调整计算精度,避免因过度精确而导致的...

    CSharp小数位数保留的方法大全

    `NumberFormatInfo` 类提供了一种自定义数字格式的方法,可以精确控制小数点后的位数。以下是一个具体的示例: ```csharp System.Globalization.NumberFormatInfo provider = new System.Globalization....

    精确计算Double型数据

    精确计算Double型数据,可用于货币计算

    Java 精确计算-double-float-String

    标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...

    iOS 解决floatValue,doubleValue等计算不精确问题,一句话解决精确计算,精确比较

    5. **利用String的`floatValue`和`doubleValue`**:虽然`floatValue`和`doubleValue`在计算时可能出现不精确,但在将字符串转换为浮点数时,它们可以提供精确的转换。例如,从用户输入或者配置文件中读取浮点数时,...

    double类型精度丢失;double转换到64位整数

    2. **保留特定小数位**: 如果知道需要保留的小数位数,可以先将`double`乘以相应的10的幂,然后进行整数转换,再除回相同幂的10,但这只能解决特定场景下的问题。 3. **使用高精度库**: 如果需要处理大量的浮点计算...

    BigDecimal向Double转换

    在Java编程语言中,BigDecimal是一种用于处理高精度数值的数据类型,尤其适用于金融计算等领域,因为它可以提供不受限的小数位数精度以及精确的数学运算能力。然而,在某些情况下,我们可能需要将BigDecimal类型的值...

    double 计算过程出现的误差

    在计算机编程领域,尤其是涉及到数值运算时,经常会遇到由于浮点数表示不精确而导致的计算误差问题。本篇文章将深入探讨在C#、SQL Server以及Oracle数据库中使用`double`类型进行计算时可能出现的误差,并通过具体的...

    Java中限制小数位数问题

    `BigDecimal`类提供了精确的浮点数运算能力,非常适合用于需要高精度的场景。通过调用`setScale`方法可以方便地设置小数位数,并指定四舍五入的方式。 ```java double f = 111231.5585; BigDecimal b = new ...

    Java Double相加出现的怪事

    Java 中的浮点数类型 float 和 double 在进行运算时会出现不精确的问题,这是因为计算机无法精确地表示十进制小数。这种问题不仅存在于 Java 中,在其它许多编程语言中也存在。 问题的提出: 编译运行下面的 Java ...

    基于C++浮点数(float、double)类型数据比较与转换的详解

    例如,使用`%.8lf`格式化`float`可能无法避免精度丢失,而在适当情况下,对`double`使用`%.20lf`可以保留更多位数,减少精度损失。 3. **浮点数比较**: 直接使用`==`操作符比较两个`double`类型的浮点数是否相等...

    c++ string转换double

    ### C++ 中 string 转换为 double 的方法 在 C++ 编程语言中,字符串(`std::string`)与数值类型(如 `int`、`double`)之间的转换是常见的需求之一。这种转换通常用于处理用户输入的数据、解析配置文件或处理网络...

    c++中double与string相互转换算法

    本文将详细讨论如何在C++中将`double`类型的数值转换为`std::string`字符串,以及如何将`std::string`转换回`double`。我们将基于提供的`stringtodouble`工程文件进行讨论。 首先,让我们探讨`double`转`string`的...

    cell_double.rar_cell_cell double_cell类型转换_cell转double_文件转换为cell

    然而,在处理数值计算时,通常需要将`cell`类型的数据转换为`double`类型,以便进行精确的数学运算。本文将详细讨论如何在MATLAB中进行这种类型转换,并提供相关的函数和技巧。 1. **什么是Cell类型?** `cell`是...

    double类型转换

    通过定义特定的模式(pattern),可以精确控制数字的格式,包括小数点后的位数、前导零的存在与否等。 ##### 示例代码: ```java import java.text.DecimalFormat; public class DoubleFormatExample { public ...

Global site tag (gtag.js) - Google Analytics