首页 > 其他分享 >浮点数精度丢失问题

浮点数精度丢失问题

时间:2025-01-20 17:57:08浏览次数:3  
标签:10 存储 BigDecimal 浮点数 丢失 精度

目录

一、浮点数精度丢失的概念

二、以0.1为例的二进制转换过程

三、存储精度限制导致的问题

四、设置精度避免无限循环与精度丢失的关系

五、解决和缓解精度丢失的方法

          六、总结


一、浮点数精度丢失的概念

        当某些十进制小数在二进制中是无限循环小数时,计算机在存储和处理这些小数时,由于存储位数的限制,无法精确表示它们,这就会导致浮点数精度丢失。

二、以0.1为例的二进制转换过程

  • 对于十进制小数 0.1,将其转换为二进制的过程如下:

    • 0.1 * 2 = 0.2,取整数部分 0

    • 0.2 * 2 = 0.4,取整数部分 0

    • 0.4 * 2 = 0.8,取整数部分 0

    • 0.8 * 2 = 1.6,取整数部分 1

    • 0.6 * 2 = 1.2,取整数部分 1

    • 0.2 * 2 = 0.4,取整数部分 0(开始循环)

    • 0.4 * 2 = 0.8,取整数部分 0

    • 0.8 * 2 = 1.6,取整数部分 1

    • 0.6 * 2 = 1.2,取整数部分 1

    • 以此类推,会形成一个无限循环的二进制小数:0.0001100110011...

三、存储精度限制导致的问题

        计算机存储浮点数时,使用有限的位数(如 float 是 32 位,double 是 64 位)。

对于 float 类型,它使用 23 位存储尾数,对于 double 类型,使用 52 位存储尾数。

由于存储位数有限,无法精确存储无限循环的二进制小数,因此会截断二进制表示,导致精度丢失。

四、设置精度避免无限循环与精度丢失的关系

        在将十进制小数转换为二进制时设置精度,是为了在转换过程中避免无限循环的计算,但这并不能完全解决浮点数精度丢失的问题。

        精度丢失主要是由于存储浮点数的有限位数造成的,而不是仅仅在转换过程中设置精度就能解决的。

五、解决和缓解精度丢失的方法

使用高精度计算库:如 Java 中的 BigDecimal 类,可以精确表示和计算浮点数。

import java.math.BigDecimal;

public class BigDecimalExample {
    public static void main(String[] args) {
        // 基本类型会产生“精度丢失”问题
        double x = 10 - 9.9;
        double y = 1 - 9.0 / 10;
        System.out.println("10 - 9.9 = "+ x);
        System.out.println("1 - 9.0 ÷ 10 = "+ y);
        
        // double x = 10 - 9.9
        System.out.println("解决:double x = 10 - 9.9 的精度丢失问题。");
        BigDecimal dec1 = new BigDecimal("10");
        BigDecimal dec2 = new BigDecimal("9.9");
        BigDecimal decx = dec1.subtract(dec2);
        System.out.printf("%.1f - %.1f = %.1f\n",dec1,dec2,decx);

        // double y = 1 - 9.0 / 10
        System.out.println("解决:double y = 1 - 9.0 / 10 的精度丢失问题。");
        BigDecimal dec3 = new BigDecimal("1.0");
        BigDecimal dec4 = new BigDecimal("9.0");
        BigDecimal dec5 = new BigDecimal("10");
        BigDecimal decy = dec3.subtract(dec4.divide(dec5));
        System.out.printf("%.1f - %.1f ÷ %.1f = %.1f\n",dec3,dec4,dec5,decy);
    }
}

运行结果:

六、总结

        某些十进制小数在二进制中是无限循环小数,如 0.1,会导致存储和计算时的精度丢失。

设置转换时的精度只能避免无限循环的计算,但无法解决存储位数有限导致的精度丢失。

使用高精度计算库(如 BigDecimal)可以缓解浮点数的精度丢失问题。

总之,浮点数精度丢失是由于存储位数有限导致的,在涉及精确计算时,需要考虑使用高精度数据类型或计算库,而不是仅仅依靠设置转换精度

标签:10,存储,BigDecimal,浮点数,丢失,精度
From: https://blog.csdn.net/CSDN_xysf/article/details/145246870

相关文章

  • 深入解析d3dx9_39.dll丢失及有效修复方法?为何会出现d3dx9_31.dll丢失?该如何应对?
    在计算机使用过程中,不少用户都遭遇过d3dx9_39.dll丢失的困扰。d3dx9_39.dll丢失究竟是怎么一回事呢?d3dx9_39.dll是DirectX9.0cRedistributable的重要组成部分。许多游戏和图形相关软件在运行时依赖它来实现各种图形渲染、动画展示等功能。当d3dx9_39.dll丢失时,这些依赖它的程......
  • 【洛谷P1303】高精度乘法
    A*BProblem题目背景高精度乘法模板题。题目描述给出两个非负整数,求它们的乘积。输入格式输入共两行,每行一个非负整数。输出格式输出一个非负整数表示乘积。样例#1样例输入#112样例输出#12提示每个非负整数不超过10^{2000}。入坑OI这么久发现还没有写过......
  • 高精度3D建模,满足多元应用需求!
    在当今这个数字化快速发展的时代,3D建模技术已经成为推动各行各业转型升级的重要驱动力。作为这一领域的佼佼者,积木易搭凭借强悍的软硬件实力、灵活的模型交付格式、自研的3D交互展示引擎以及领先的多终端适配技术,为客户提供了一站式的3D建模解决方案,助力客户在数字世界中脱颖而......
  • msvcp100.dll丢失的五种修复方法分析,教你一步步修复msvcp100.dll
    如果你发现自己的电脑出现了“msvcp100.dll缺失”的错误,这可能会暂时妨碍一些软件的使用。msvcp100.dll文件是MicrosoftVisualC++2010的一个组成部分,对于许多应用程序来说是不可或缺的。在本文中,我们将向你展示几种简便的方法,帮助你快速解决这个问题。一.探讨msvcp100.dll......
  • 东方博宜【基础】1268. 高精度加法
    问题描述计算 a+b 的值,a,b 皆为不超过240 位的非负整数。输入两个正整数,每行一个。输出一个数,代表两个整数的和。样例输入12输出3输入00输出0输入1111111111111111111122222222222222222222输出33333333333333333333说明备注a,b 两个整数都不含......
  • 彻底摆脱困扰:掌握解决系统提示丢失MSVCR120.dll疑难杂症的终极指南
    当我们的电脑系统突然弹出提示,告知我们计算机中丢失了MSVCR120.dll文件时,这无疑会给我们的日常使用带来困扰。特别是一些依赖此文件的程序和游戏,可能会因此无法正常启动或运行。面对这一问题,许多用户会选择自行下载缺失的msvcr120.dll文件,然而,仅仅下载文件并不足够,正确的放置位......
  • LILIKOI光纤FBG传感器:高精度测量与实时温度补偿的领先技术
    LILIKOI光纤FBG力传感器在光纤传感技术凭借其高精度力测量能力,为工业自动化、医疗和航空航天等领域提供了可靠的解决方案。该传感器利用光纤布拉格光栅(FBG)技术,通过监测反射波长的变化来实现对力的精确测量,具有高灵敏度和抗干扰能力GR25传感器是LILIKOI光纤FBG力传感器系列中......
  • iutils.dll会影响什么?关于iutils.dll丢失的深度分析及应对丢失策略解析
    在计算机系统的世界里,动态链接库(DLL)文件起着至关重要的作用,它们是许多应用程序能够正常运行的基石。其中,iutils.dll就是这样一个具有重要意义的文件。iutils.dll会影响什么?关于iutils.dll丢失的深度分析及应对丢失策略解析。一、你了解iutils.dll吗?——基本情况揭秘iutils.d......
  • 解锁 msvcr110.dll 丢失之谜——几种msvcr110.dll丢失的解决方法
    在计算机使用过程中,我们可能会遇到各种各样的问题,其中“msvcr110.dll丢失”就是一个比较常见且令人困扰的情况。msvcr110.dll是微软VisualC++2012RedistributablePackage中的一个重要动态链接库文件,它对于许多软件的正常运行起着至关重要的作用。当系统提示“msvcr110.dll......
  • 安装软件缺少msvcp110.dll怎么办?出现dll丢失的解决方法
    在日常使用电脑安装各类软件的过程中,相信不少朋友都遇到过“缺少msvcp110.dll”的报错提示。下面就来深入聊聊这个msvcp110.dll文件,以及当它缺失时,我们该如何巧妙应对。一、msvcp110.dll文件介绍1.1定义与功能msvcp110.dll是微软VisualC++2012运行时库的一个......