Unity中的浮点数

本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com

Unity float f =0.1f 为什么 $“{f}” 输出的时候会是 0.100000001

C# 中的 $"{}" 是一个字符串插补(String Interpolation)的语法糖,用于方便地创建和修改字符串。

在 $“{}” 的 {} 里面,我们可以直接放入变量,或者一些表达式。编译器会自动将其替换为相应的字符串。

这是一个非常有用的特性,它使得拼接和格式化字符串更加简单直观。例如,我们可以非常方便地在字符串中插入变量的值:

int age = 20;
string name = "John";
string result = $"Hello, my name is {name} and I am {age} years old.";

你可以在 {} 中放入变量, 编译器会将其替换成变量的值。但是,如果你在这个过程中遇到精度丢失,那可能是浮点数的精度问题。在 C#中,float 是 32 位的,能够精确到 7 位,而 double 是 64 位的,能精确到 15 位。这些都是不完全准确的,因为这些类型在内部是以二进制的形式存储的,只有某些十进制小数可以精确地转换为二进制小数。因此,在存储或转换时,可能会有一些轻微的舍入错误。

float f = 0.1f;
Console.WriteLine($"{f}");//0.100000001

尽管你可能期望输出 0.1,但实际输出可能是 0.100000001 或类似的,这是因为 0.1 不能精确地表示为二进制小数。

在数字系统中,某些十进制数无法精确地表示为二进制数。例如,十进制的 0.1 或 0.2 就不能被精确地表示为一个二进制的浮点数。

让我们以 0.1 为例来说明一下:十进制下的 0.1 转换为二进制数是一个无限循环小数,

将十进制数 0.1 转换为二进制可以通过以下步骤进行近似计算:

  1. 将小数部分乘以2,并取整数部分作为二进制的一位。重复这一步骤直到小数部分为0或者达到所需的精度。

具体步骤如下:

  • 0.1 * 2 = 0.2,整数部分为 0
  • 取小数部分 0.2,继续乘以2
  • 0.2 * 2 = 0.4,整数部分为 0
  • 取小数部分 0.4,继续乘以2
  • 0.4 * 2 = 0.8,整数部分为 0
  • 取小数部分 0.8,继续乘以2
  • 0.8 * 2 = 1.6,整数部分为 1
  • 取小数部分 0.6,继续乘以2
  • 0.6 * 2 = 1.2,整数部分为 1
  • 取小数部分 0.2,继续乘以2
  • 0.2 * 2 = 0.4,整数部分为 0

这个过程会一直重复下去,因为 0.1 在二进制中是一个无限循环小数。因此,无法用有限位数的二进制小数来精确表示 0.1。

即 0.0001100110011001100110011…,对于这样的无限小数,计算机无法精确存储,会在一定的位数后进行截断或者四舍五入,这样就会产生精度误差,这是由浮点数的表示方法决定的。

然而,某些十进制数是可以精准的被转换为二进制数的。比如,0.5、0.25、0.75 等。这是因为他们在二进制中为有限的小数。例如,0.5 在二进制中是 0.1,0.25 在二进制中是 0.01。这些小数在计算机中可以被精确表示。

因此,在计算机编程中,一般不建议直接比较两个浮点数是否完全相等,因为可能会因为这些精度问题导致比较结果不准确。如果要比较两个浮点数是否相等,通常的做法是检查它们是否 “足够接近”,也就是它们之间的差的绝对值是否小于一个很小的正数。

在涉及到需要高精度的计算或表示时你应该用 decimal 类型。另外,如果只是在输出的时候遇到了这种情况,你可以考虑格式化输出,比如用 “F2” 保留两位小数:

float f = 0.1f;
Console.WriteLine($"{f:F2}");

但是请注意,这只会影响输出的显示,不会解决浮点数精度的根本问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/704069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络技术ensp 一个简单的交换机配置案例

由于工作调岗,转战网络运维了,第一次网络笔记 1.,目的:2台主机相互可以ping通,并且可以ping通网关地址,设备:2台主机,2台交换机 2网络拓扑图如下 3.主机pc1的配置信息 ip&#xff…

Xcode与Swift开发小记

文章目录 引子Xcode工程结构核心概念Swift语法速记(TODO)小技巧单元测试中使用awaitSwiftUI中使用ListView中取数据 常见问题Xcode添加package时连接github超时Xcode无法修改快捷键,一闪而过 引子 鉴于React Native目前版本在iOS上开发遇到诸多问题,本以…

【SpringBoot3】SpEL表达式详细使用说明

一、介绍 SpEL(Spring Expression Language)是Spring框架提供的一种功能强大的表达式语言,用于在运行时查询和操作对象。 主要特点和用途包括: 简洁性:SpEL表达式使用简洁的语法,使得在Spring配置和代码…

前端取图片相同颜色作为遮罩或者背景

需求 遮罩层取图片相同/相似的颜色作为遮罩 效果 做法 npm库 grade.js 所提供图像中前 2 个主色生成的互补渐变https://github.com/benhowdle89/grade COLOR THIEF 只需使用Javascript即可从图像中获取调色板。 https://github.com/lokesh/color-thief https://lokeshd…

DNS的意义,DNS不可用该怎么办

DNS是域名系统,它负责将我们输入的网址(如www.baidu.com)转换成计算机可以理解的IP地址(如127.0.0.1)。DNS设置的好坏,直接影响到我们的上网速度和体验。 一、DNS的重要性 在访问一个网站时,首先需要通过DNS将域名解析为对应的IP地址。如果DN…

5.24 BCC工具之funccount.py解读

一,工具简介 funccount工具可以追踪与指定模式匹配的函数、追踪点或USDT探针,并会在追踪过程中打印它们的计数摘要。 二,代码示例 #!/usr/bin/env pythonfrom __future__ import print_function from bcc import ArgString, BPF, USDT from time import sleep, strftime …

【深度学习笔记】4_2-3 模型参数的访问、初始化和共享

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 4.2 模型参数的访问、初始化和共享 在3.3节(线性回归的简洁实现)中,我们通过init模块来初始化模型…

AIGC专栏9——Scalable Diffusion Models with Transformers (DiT)结构解析

AIGC专栏9——Scalable Diffusion Models with Transformers (DiT)结构解析 学习前言源码下载地址网络构建一、什么是Diffusion Transformer (DiT)二、DiT的组成三、生成流程1、采样流程a、生成初始噪声b、对噪声进行N次采样c、单次采样解析I、预测噪声I…

kitti数据显示

画出track_id publish_utils.py中 def publish_3dbox(box3d_pub, corners_3d_velos, types, track_ids):marker_array MarkerArray()for i, corners_3d_velo in enumerate(corners_3d_velos):marker Marker()marker.header.frame_id FRAME_IDmarker.header.stamp rospy.T…

Pytorch训练RCAN QAT超分模型

Pytorch训练RCAN QAT超分模型 版本信息测试步骤准备数据集创建容器生成文件列表创建文件列表的代码执行脚本,生成文件列表训练RCAN模型准备工作修改开源代码编写训练代码执行训练脚本可视化本文以RCAN超分模型为例,演示了QAT的训练过程,步骤如下: 先训练FP32模型再加载FP32训练…

量子计算学习经验

推荐B站冉仕举老师视频(老师讲的详细又耐心,张量网络做量子计算,不过有些基础概念都是通用的) StringCNU的个人空间-StringCNU个人主页-哔哩哔哩视频 2《量子计算与量子信息》是经典的教材书的,但是大部分同学第一次看…

【随笔】固态硬盘数据删除无法恢复(开启TRIM),注意数据备份

文章目录 一、序二、机械硬盘和固态硬盘的物理结构与工作原理2.1 机械硬盘2.11 基本结构2.12 工作原理 2.2 固态硬盘2.21 基本结构2.22 工作原理 三、机械硬盘和固态硬盘的垃圾回收机制3.1 机械硬盘GC3.2 固态硬盘GC3.3 TRIM指令开启和关闭 四、做好数据备份 一、序 周末电脑突…

数据库设计过程中的各种模式

在数据库设计过程中,有几种常见的模式,它们有助于组织和管理数据。以下是这几种模式的简介: 主扩展模式(也称为主从模式):这种模式适用于多个表具有相似结构的情况。这些表共享某些基本属性(也…

备战蓝桥之二分

二分题目: B3880 [信息与未来 2015] 买木头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.security.PublicKey; impor…

【Qt学习】QLineEdit 控件 属性与实例(登录界面,验证密码,正则表达式)

文章目录 1. 介绍2. 实例使用2.1 登录界面2.2 对比两次密码是否相同2.3 通过按钮显示当前输入的密码(并对2.2进行优化)2.4 结语 3. 正则表达式3.1 QRegExp3.2 验证输入内容 4. 资源代码 1. 介绍 关于 QLineEdit 的详细介绍,可以去查阅官方文…

[计算机网络]--IP协议

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、IP协议…

202432读书笔记|《泰戈尔的诗》——什么事让你大笑,我生命的小蓓蕾

202432读书笔记|《泰戈尔的诗》——什么事让你大笑,我生命的小蓓蕾 《泰戈尔写给孩子的诗(中英双语版)》作者拉宾德拉纳特泰戈尔文 张王哲图,图文并茂的一本书,文字与图画都很美,相得益彰!很值得…

【Memory协议栈】EEPROM Abstraction模块详细介绍

目录 前言 正文 1.功能简介 2.关键概念 3.功能详解 3.1 Addressing scheme and segmentation 3.2 Address calculation 3.3 Limitation of erase / write cycles 3.4 Handling of “immediate” data 3.5 Managing block consistency information 4.关键API定义 4.…

学习磁盘管理

文章目录 一、磁盘接口类型二、磁盘设备的命名三、fdisk分区四、自动挂载五、扩容swap六、GPT分区七、逻辑卷管理八、磁盘配额九、RAID十、软硬链接 一、磁盘接口类型 IDE、SATA、SCSI、SAS、FC(光纤通道) IDE, 该接口是并口。SATA, 该接口是串口。SCS…