zoukankan      html  css  js  c++  java
  • Java中float和double转换的问题

      为什么double转float不会出现数据误差,而float转double却误差如此之大?  

    double d = 3.14;  
    float f = (float)d;  
    System.out.println(f);  
    输出结果是:3.14;   
    float f = 127.1f;  
    double d = f;  
    System.out.println(d);  
    输出结果是:127.0999984741211   
    为什么结果会是这样呢?  
    如何避免这样的问题发生,让float转double能得到实际的数据?  
    解决办法:现将float型转换为字符串型,再转换为精度更高的BigDecimal型,再将其转换为double型。
    float f = 127.1f;  
    BigDecimal b = new BigDecimal(String.valueOf(f));  
    double d = b.doubleValue();  
    System.out.println(d);  

     

    /**   
      * 提供精確的加法運算   
      * @param args   
      */   
      public static double add(double v1, double v2) {   
      BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      return b1.add(b2).doubleValue();   
      }   
        
      /**   
      * 提供了精確的減法運算   
      *   
      * @param args   
      */   
      public static double sub(double v1, double v2) {   
      BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      return b1.subtract(b2).doubleValue();   
      }   
        
      /**   
      * 提供了精確的乘法運算   
      * @param args   
      */   
      public static double mul(double v1, double v2) {   
      BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      return b1.multiply(b2).doubleValue();   
      }   
        
      /**   
      * 提供了(相對)精確的除法運算,當發生除不儘的情況時,精確到   
      * 小數點以後110位   
      * @param args   
      */   
      public static double div(double v1, double v2) {   
      return div(v1, v2, DEF_DIV_SCALE);   
      }   
        
      /**   
      * 提供了(相對)精確的除法運算,當發生除不儘的情況時,由scale參數指定   
      * 精度,以後的數字四捨五入   
      * @param args   
      */   
      public static double div(double v1, double v2, int scale) {   
      if (scale < 0) {   
      throw new IllegalArgumentException(   
      "The scale must be a positive integer or zero");   
      }   
      BigDecimal b1 = new BigDecimal(Double.toString(v1));   
      BigDecimal b2 = new BigDecimal(Double.toString(v2));   
      return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();   
      }   
        
      /**   
      * 提供了精確的小數位四捨五入處理   
      * @param args   
      */   
        
      public static double round(double v, int scale) {   
      if (scale<0) {   
      throw new IllegalArgumentException("The scale must be a positive integer or zero");   
      }   
      BigDecimal b = new BigDecimal(Double.toString(v));   
      BigDecimal one = new BigDecimal("1");   
      return b.divide(one, scale, BigDecimal.ROUND_HALF_DOWN).doubleValue();   
      }   
        
      public static void main(String[] args) {   
      System.out.println(add(1.2321231, 3.7865765));   
      System.out.println(sub(6.4523423, 1.2321231));   
      System.out.println(mul(6.4523423, 3.7865765));   
      System.out.println(div(6.4523423, 3.7865765, 5));   
      System.out.println(round(3.7865765, 5));   
      }   
    }
      JAVA中float为四个字节,double为八个字节,float--->double时候会补位,如果这里补位不出现误差的话应该可以实现。
    你先将float类型数据包装成BigDecimal数据,然后调用其floatValue()方法可以实现。

     

  • 相关阅读:
    关于DotNETStruts
    SQL语句导入导出大全
    一个打印Dataset的.net的打印类
    遍历指定文件夹下所有的文件
    SQL Server SQL导入导出语句
    查看OCX的属性和方法的脚本
    关于写文本文件的问题
    新钶信息系统面试
    【POJ1208】The Blocks Problem
    【POJ1363】Rails
  • 原文地址:https://www.cnblogs.com/javahr/p/8320646.html
Copyright © 2011-2022 走看看