为什么java中floatda正确_为什么cast to float在java中产生正确的结果?

文档没有特别好地解释,但

Double.toString(double)基本上在它产生的输出中执行一些舍入. Double.toString算法在整个Java SE中使用,包括例如System.out的PrintStream.println(double).文档说明了这一点:

How many digits must be printed for the fractional part of m or a? There must be at least one digit to represent the fractional part,and beyond that as many,but only as many,more digits as are needed to uniquely distinguish the argument value from adjacent values of type double. That is,suppose that x is the exact mathematical value represented by the decimal representation produced by this method for a finite nonzero argument d. Then d must be the double value nearest to x; or if two double values are equally close to x,then d must be one of them and the least significant bit of the significand of d must be 0.

换句话说,它表示toString的返回值不一定是参数的精确十进制表示.唯一的保证是(粗略地说)参数比任何其他双值更接近返回值.

因此,当您执行类似System.out.println(1.10)和1.10的操作时,这并不意味着传入的值实际上等于基数10值1.10.相反,基本上会发生以下情况:

>首先,在编译期间,检查文字1.10并舍入以产生最接近的double值. (它在JLS here中说,对此的规则例如在Double.valueOf(String)中详细说明为double.)

>其次,当程序运行时,Double.toString生成一个十进制值的字符串表示形式,上一步生成的double值比任何其他double值更接近.

恰好在第二步中转换为String通常会生成一个与第一步中的文字相同的String.我认为这是设计的.无论如何,文字,例如1.10不会产生一个精确等于1.10的双精度值.

您可以使用BigDecimal(double)构造函数发现double(或float的实际值,因为它们总是可以放在double中):

When a double must be used as a source for a BigDecimal,note that this constructor provides an exact conversion; it does not give the same result as converting the double to a String using the Double.toString(double) method and then using the BigDecimal(String) constructor. To get that result,use the static valueOf(double) method.

// 0.899999999999999911182158029987476766109466552734375

System.out.println(new BigDecimal((double) ( 2.00 - 1.10 )));

// 0.89999997615814208984375

System.out.println(new BigDecimal((float) ( 2.00 - 1.10 )));

你可以看到,结果都不是0.9.在这种情况下,Float.toString恰好产生0.9而Double.toString则不然,这或多或少只是巧合.

作为旁注,(双)(2.00 – 1.10)是一个冗余演员. 2.00和1.10已经是双重文字,因此评估表达式的结果已经是双倍的.另外,要减去float,你需要转换两个操作数,如(float)2.00 – (float)1.10或使用浮动文字,如2.00f – 1.10f. (float)(2.00 – 1.10)仅将结果转换为float.

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

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

相关文章

war包怎么解压_渣渣辉表情包下载-渣渣辉抖音表情包动态图下载

详情介绍渣渣辉表情包怎么制作?渣渣辉表情包gif在线生成工具应用安装资源推荐给大家,这是一款最近抖音上相当火爆的趣味聊天必备神器。这里各种各样的动态表情包应有尽有,你喜欢的表情包这里都有。感兴趣的小伙伴赶紧下载体验吧!关…

不足补0 java_Java Android 开发数字不足位数前面补0

import java.text.decimalformat;public void changecolor(view view) {decimalformat decimalformat new decimalformat("000");//获取随机数对象,产生三个随机数值(rgb值)random x new random();int red x.nextint(256);string sred decimalformat.…

python数据分析_使用Python进行数据分析

麦金尼编写的《使用Python进行数据分析》是最经典的数据分析教材,本专栏主要应用视频讲解的方式,讲授本书核心思想,并提供本教材的所有代码和代码点评。注意:视频网址必须用电脑台式机打开!手机访问不到视频。注意&…

java.policy无法修改_如何配置Policy文件进行Java安全策略的设置

中国人最喜欢访问的网站只要注册ofo就送你10块钱,还等什么,快来注册吧Java语言具有完善的安全框架,从编程语言、编译器、解释程序到Java虚拟机,都能确保Java系统不被恶意的代码或敌对的编译器暗中破坏,它们能够保证Jav…

百度原创度在线检测_资深自媒体作者:做自媒体没有这款“原创度检测”软件是不行的...

目前市面上除了今日头条自媒体平台外,好友好多好多其它的自媒体平台,比如百度的百家号、360的快船号、腾讯的企鹅号等等,各种各样的自媒体平台,如此多的自媒体平台大家每天写作的资源和话题也就那么多,免不了有些人就会…

如何看懂串口通讯协议_一文看懂PLC的通讯方式——AB系统(一)

写在前面一直以来,PLC跟其他设备的通讯方式都是自动化工程师入门学习的难点和要点。说它难,因为这里面牵扯到了数据通讯的一些知识,大多数从事PLC工作的人员都是从电气、电子、自动化、机电等相关专业出身的,可能上学时候也只是简…

linux mysql 实战_linux实用实战

1、编译安装搭建wordpress软件环境:apr-1.6.2.tar.gzphp-7.1.10.tar.xz http://php.net/mariadb-10.2.8-linux-x86_64.tar.gz http://mariadb.org/wordpress-4.8.1-zh_CN.tar.gz https://cn.wordpress.org/1 、源码编译安装Httpd2.4(1)安装包组和包yum groupinstall…

java不需要返回数据时_从Java方法返回时,BigDecimal不保持实际值

我正在用Java制作货币转换应用程序.其他一些很棒的StackOverflowians给了我建议读取BigDecimal,目的是替换double来解决任何精度问题.我有两个方法系统;它从起始货币转换为美元,然后将美元价值转换为目标货币.请注意,我的转化率存储如下:// Conversion Rates - STAR…

openstack架构详解图_英特尔顶级技术专家合力缔造精品:Linux开源网络全栈详解...

日常水开篇自1991年诞生起,Linux已经走过了接近三十年。Linux早已没有了问世时的稚气,正在各个领域展示自己成熟的魅力。以Linux为基础,也衍生出了各种开源生态,例如网络和存储。而生态离不开形形色色的开源项目,在人人…

java多次点击时事件_click事件的累加绑定,绑定一次点击事件,执行多次

我的github(PS:希望star):https://github.com/thWinterSun/v-admin最近做项目为一个添加按钮绑定点击事件,很简单的一个事情,于是我按照通常做法找到元素,使用jquery的on()方法为元素绑定了点击事件,点击同时发送请求。完成后看效…

基于matlab的fisher线性判别及感知器判别_基于嵌入表示的网络实体对齐方法进展概述...

网络实体对齐是指给定两个网络,把两个网络中等价的实体合并。实体对齐在很多领域都有重要应用,比如,跨平台社交网络的用户对齐可以用于用户画像、用户兴趣挖掘,跨语言知识图谱的实体对齐可以辅助机器翻译、跨语言信息检索。传统的…

回调java 简书_Java接口回调机制详解【转】

一、回调的含义和用途1. 什么是回调?一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类:同步调用、异步调用和回调。同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名…

mfc指示灯报警显示_奔驰车辆常用指示灯功能讲解

点击箭头处“蓝色字”,关注我们哦!!今天将为大家解析车辆仪表盘指示灯功能,当然,我们为大家带来的是奔驰车型的指示灯解读。奔驰在指示灯上的设计是什么风格呢?下面我们就来带大家详细解读。疲劳驾驶报警指…

java无锁消费者框架_无锁并行框架多生产者多消费者模型

下面看一下多生产多消费者的模式,下面的代码是模拟100个生产者,每个生产者生产100个事件,然后有3个消费者,同时进行消费,共消费1W个事件,下面看一下代码:这边new出了3个消费者,并把消…

win10无法连接到这个网络_电脑无法连接网络怎么办?(有线网络篇)

哈喽!各位小伙伴大家好呀!好久不见,近期真的太多小伙伴咨询网络问题了,没办法,虽然以前写过相关文章,断网、网络卡、慢、掉线的常规解决方法不过可能还不够细致,本篇就尽量把所有的问题都提出解…

LeetCode反转链表java_Leetcode 反转链表系列 图解详细过程

对于一个程序猿来说,数据结构和算法的重要性就不用我多说了吧,算法题已然成了现在大厂笔试面试的重头戏,废话少说,Leetcode 刷起来呀。说起刷 Leetcode,我建议你按 tag 刷,不然只能像无头苍蝇,东…

amd插帧技术如何开启_联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程...

联想ThinkPad笔记本电脑如何开启CPU的虚拟化技术图文教程很多情况下可能我们都需要开启CPU虚拟化技术,例如我们需要打开安卓模拟器,在打开安卓模拟器的时候如果提示您需要CPU虚拟化技术,那么我们需要在主板BIOS设置中进行开启,下面…

java中的同步关键字_Java中进程同步问题,锁 和synchronized 关键字的用法

标签:•对象的锁标志–每个对象都有一个锁标志–使用synchronized可与锁标志交互•synchronized关键字的用法有两种:–synchronized语句–synchronized方法•synchronized语句:synchronized (obj){//在synchronized语句块中//对obj的成员只能…

没有内存条电脑能开机吗_换内存加固态,老电脑也能快到起飞,附纯国产内存条雷赤测评...

我在公司里用的那台电脑是品牌机,配置有点低,处理器是i3-6100,内存是4GB,硬盘是1TB的机械,这个配置日常办公是没有问题的,但是现在有一些活已经超出了这个配置的能力,加之近期的一些工作还需要在…

java方法报错_.setUndecorated 方法报错

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.awt.*;import javax.swing.*;public class FrameTest{public static void main(String[] args){EventQueue.invokeLater(new Runnable(){public void run(){JFrame frame new SimpleFrame();frame.setUndecorated(tru…