某次double強轉int時精度損失的情況以及原因分析
今日寫了一段程式碼,把雙精度浮點型強制轉型成整形,發現所得結與預測不符。
結果如下:
既然4.14*100=414,為什麼把強轉之後得到的結果卻是413呢?
我們不如做個實驗,測試一下原因。
實驗如下:
測試發現414-(a*100)並不完全等於0,實際上有一定的誤差。
由f = (414-(a*100)) = 0.000000000和g = ((a*100)-414) = -0.000000000,可以推斷,a*100的值實際是小於414的。
我的分析:計算機並不能用double型中的64bit的0和1精確的表示出4.14,所以4.14只是一個近似值(也許是4.1399999...)
因此a*100實際的值可能是319.99999...(十分接近414,結果被輸出時舍入成414了),導致最後強制轉型成整型的時候413.99999...被舍入到413。
假若有不對的地方,懇請指出!
期待看到大家更好的解釋!!
相關推薦
某次double強轉int時精度損失的情況以及原因分析
今日寫了一段程式碼,把雙精度浮點型強制轉型成整形,發現所得結與預測不符。 結果如下: 既然4.14*100=414,為什麼把強轉之後得到的結果卻是413呢? 我們不如做個實驗,測試一下原因。 實驗如下: 測試發現414-(a*100)並不完全等於0,實際上有一定的誤差。
分析一次double強轉float的翻車原因
背景 人逢喜事精神爽,總算熬到下班撩~~ 正準備和同事打個招呼回家,被同事拖住問了.
Mysql查詢數字類型結果為Object,強轉int報錯
log num 1=1 ont ges long str 技術 mysql查詢 問題描述: SQL文:SELECT COUNT(1) NUM FROM test WHERE 1=1 Java代碼: 圖中強轉int失敗 問題原因: dal層查詢出來的數字是Long型
兩數求和java(字符串強轉int型)
ava import result addition class a res plain first owin import javax.swing.JOptionPane; public class Addition { public static void m
byte轉int時為什麼要與上0xFF
首先要給出結論: 為了保證二進位制資料的一致性 首先需要回顧一下關於計算機中儲存數字的知識點 計算機是用補碼來儲存數字的 正數的反碼和補碼等於本身 負數的反碼符號位不變其它位取反 負數的補碼等於反碼+1 一個數補碼的補碼等於原碼
double 計算時精度損失
計算double型別的數時有時候會多出0.000000001,會有不確定個數的0,在計算時將其轉為BigDecimal就不會出錯。 BigDecimal sum = new BigDecimal(0.0); BigDecimal tmp = new
java中四捨五入——double轉BigDecimal的精度損失問題
背景 在部落格 噁心的0.5四捨五入問題 一文中看到一個關於 0.5 不能正確的四捨五入的問題。主要說的是 double 轉換到 BigDecimal 後,進行四捨五入得不到正確的結果: public class BigDecimalTest {
記一次OGG數據寫入HBase的丟失數據原因分析
hat xdg column 安裝 tint b- 主鍵 取余 bst 一、現象二、原因排查2.1 SparkStreaming程序排查2.2 Kafka數據驗證2.3 查看OGG源碼2.3.1 生成Kafka消息類2.3.2 Kafka配置類2.3.3 Kafka 消息發
Ios短視訊開發初始化短視訊失敗或延時太長的問題原因分析
在人們都追求快節奏的現在,手機APP開啟速度都會成為購買手機時要考慮的重要問題,聯通網路公司斷網半個小時能引起民憤,那麼移情考慮到短視訊平臺上來說,在視訊播放方面,初始化短視訊的時間當然是越短越好。 現如今所有的短視訊平臺在音視訊傳輸方面大都使用的是流媒體傳輸,至於伺服器方面也不是我們敲段程式碼
caffe訓練CNN時,loss不收斂原因分析
人工智慧/機器學習/深度學習交流QQ群:811460433 也可以掃一掃下面二維碼加入微信群,如果二維碼失效,可以新增博主個人微信,拉你進群 1. 資料和標籤 資料分類標註是否準確?資料是否乾淨? 另外博主經歷過自己建立資料的時候資料標籤設定為1,2,...,N,
TCP三次握手、四次握手過程,以及原因分析
首先,是需要明白一些欄位的含義,這樣三次握手、四次握手的流程圖就立馬可以很輕鬆地理解,並迅速手繪了。 (至於這兩個流程圖,網上鋪天蓋地都是,這裡就不貼出來了。) SYN:該欄位被設定為1(即true),表示請求建立連線 FIN:該欄位被設定為1(即true),表示請求關閉連
關於Java中用Double型運算時精度丟失的問題
左右 數字 col cto into lam 決定 action 簡化 註:轉自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 進行運算時,經常出現精度丟失的問題,總是在
Java初認識--基本資料型別(int 和byte之間賦值)預設值 型別強轉
主類和主方法 Test.java–是原始檔,原始檔必須與主類名(public class )保持一致,一個原始檔只能有一個主類 ,主方法存在與主類中。 Test.java 原始檔 主類:public class Test 主方法 : public static void main(Strin
Long型別轉json時前端js丟失精度解決方案
一、問題背景 Java後端開發過程中,尤其是id欄位,因數值太大,通過json形式傳輸到前端後,在js解析時,會丟失精度。 如果對精度丟失沒有什麼概念,可以看一個知乎的帖子,來感受一下:https://www.zhihu.com/question/34564427?sort=created
C#: double轉int , String轉int
該程式是在控制檯程式中測試 ,下面分別介紹兩種方法,程式碼如下: using System; namespace ConsoleApp17 { class Program { static void Main(string[] args)
Java初認識--基本資料型別(int 和byte之間賦值)預設值 型別強轉
主類和主方法 Test.java–是原始檔,原始檔必須與主類名(public class )保持一致,一個原始檔只能有一個主類 ,主方法存在與主類中。 Test.java 原始檔 主類:public class Test 主方法 : public stat
c++基礎(三):陣列自增處理及字串轉int,double
今天整理了一些陣列相關的程式碼,陣列是固定長度的,所以當長度不確定時,需要用一些其它方法來達到目的;像java中有list,set等可以不用指定長度,而c++中也有自增的陣列vector... vector的使用 std::vector<double&
Swift Double向上取整和向下取整、Double轉Int/String
floor()函式:向下取整,取小於等於這個數的最大整數 (floor(3.94) = 3) ceil()函式:向上取整,取大於等於這個數的最小整數 (ceil(3.14) = 4) import Foundation extension Double { func int
js 中將string轉化為double,避免產生多位數和計算精度損失。
整理一下,在寫js程式碼時,我們經常會因為帶有小數的運算而頭痛。因為它會出現產生多位數和計算精度損失。 在Java程式碼中我們可以有以下3種方式轉化 parseFloat("123.2") pars
C#List轉字串,字串轉List,字元陣列轉Int陣列,字串轉string,取某一位置字元等
List轉字串 [C#] 純文字檢視 複製程式碼 01 02 List<string> List = new List<string>(); string strArray = string.Join(",", List