精华内容
下载资源
问答
  • double转int

    万次阅读 2019-01-24 09:29:03
    关于double转int类型,在本来的认知中,以为任何情况强转可以搞定一切,但在实际应用时发现不然,需求是需要从excel表中读出xx.xx这样的数字信息,且需要在此数值*100后作为查询条件去db查询,这就需要精确性了,...

    关于double转int类型,在本来的认知中,以为任何情况强转可以搞定一切,但在实际应用时发现不然,需求是需要从excel表中读出xx.xx这样的数字信息,且需要在此数值*100后作为查询条件去db查询,这就需要精确性了,对于基础小白来讲,还是做个笔记记下吧,先看强转的例子:

            Double a = 2.3 * 100;
            int i = new Double(a).intValue();
            System.out.println(i);

    输出结果:229

    ok,很明显不是我们要的结果,从上面可以看出,在转换时发生了精度丢失问题,转为int类型会把后面的小数点全部砍掉,不同数据类型转换过程中会有这个问题,原因是计算机是2进制的,针对这种情况的控制方法可以使用DecimalFormat来解决:

    new DecimalFormat("0").format(a)

    返回的是String类型,控制台输出:230,具体需要保留几位可以通过DecimalFormat来进行设置。

    展开全文
  • double转int类型会丢失精度,今天我们就回答为什么会丢失精度,以及最好的解决方案.

    问题

    问题出自一个价格的转换需要将double类型转换(元)为integer类型(单位分)的数.

    $salePrice = 10.2;
    $price =(int) ($salePrice  * 100); // 1019
    

    虽然少了一分钱,但是对于这种问题的严重性,每个用户少付款一分钱,虽然说平台用户少,但对于对账会触发报警,甚至不能下单因为实际付款额与售价不等.

    接下来我们先从计算机如何存储二进制数字说起.

    二进制数字与十进制数字转换

    十进制转二进制

    整数部分 --> 转为二进制
    小数点不动
    小数部分 --> 转为二进制

    这里重点说下:小数部分转换

    0.25转换为二进制如下:

    0.25 * 2 = 0.5   // 0 取整数位如果为1取1,这里为0取0,小数部分不为0所以 拿0.5去下一步
    0.5*2     =1.0     // 1 小数部分为0 结束计算
    

    10.25就可以表示为 1010.01

    二进制转十进制

    小数部分转换:

    0.25

    0 1

    得出小数部分算法

    0*2^{-1} +  1*2^{-2}
    

    double类型在内存空间模型

    众所周知,php使用C语言实现,浮点类型在zval中是double.

    符号位     11位 指数      52位尾数
    0      0000 0000 000     000.....000
    

    以10.25为例:

    1010.01 => 转换为

    1.01001 * 2^{3}
    
    • 将符号存储至符号位,0整数,1负数
    • 将2的指数加中间数存入指数位:3+127=130
    • 将小数位存储到52位尾数位当中.
    • 整数1不需要存储.

    中间数:为了表示负指数,所以提出了一个中间数的概念. 中间数:2^n-1 n为指数位数.
    所以double类型的中间数为1023, 而float类型为127.
    例如指数为-7那么, 127 + (-7)= 120 -> 01111000,读取时候还得减去127,得出真实值.
    中间数可以理解为一个符号位,表示指数的符号.
    中间数全为1,尾数位为全为0表示无穷大
    中间数全为1,尾数位不全为0表示NaN
    中间数全为0,尾数位全为0表示0

    因此得到内存模型为:

    符号位     11位 指数      52位尾数位
    0      1000 0000 011     01001 0......000
    

    从内存模型当中读取数据时:

    符号位     11位 指数                              52位尾数位
    0      1000 0000 011                            01001 0......000
    +     130-127 = 0000 0000 011= 3    
    尾数位前补1和. => 1.01001 
    将小数点右移指数位个数(减去中间数后如果指数位最低位为1则左移) => 1010.01
    按照二进制转十进制规则得出:10.25
    

    解决方案

    PHP中可以使用bcmath库,避免精度丢失.

    两数相乘可以用bcmul这个函数.

    (int)bcmul(10.2, 100) =>  1020  
    

    使用bccomp准确比较两个任意精度类型.

    其他语言参照相关的库,C语言中也有bcmath库的实现.

    在涉及到跟金额相关的业务时候推荐最好这么做,避免产生类似不安全的问题.

    展开全文
  • java中double转int

    千次阅读 2016-04-21 01:49:53
    java中double转int  (1)、 (int) 2.9 = 2;//不进行四舍五入  (2)、 四舍五入:new BigDecimal("1.5").setScale(0, BigDecimal.ROUND_HALF_EVEN);  其中half_even: 2.5=2; 1.5=2; (类似于银行家算法)  ...
     java中double转int
       (1)、 (int) 2.9 = 2;//不进行四舍五入

       (2)、  四舍五入:new BigDecimal("1.5").setScale(0, BigDecimal.ROUND_HALF_EVEN); 

    其中half_even: 2.5=2; 1.5=2; (类似于银行家算法)

           half_up: 2.5=3, 1.5=2;

       ps: 两个int的值作除法运算,得到的为int,而且,得到的值是直接去掉小数部分。
               int a = 1/3 == 0; true; double a = 1/3 == 0; a=0.0
               double a = ((double)1)/3; a=0.333333333333; 不能写成double b = (double)1/3; 先执行1/3
             
    展开全文
  • C#: double转int , String转int

    千次阅读 2018-12-08 11:49:51
    该程序是在控制台程序中测试 ,下面分别介绍两种方法,代码如下: using System; namespace ConsoleApp17 { class Program { static void Main(string[] args) ... //doubleint //A方法: Convert.Toint...

     

    该程序是在控制台程序中测试  ,下面分别介绍两种方法,代码如下:

    using System;
    
    namespace ConsoleApp17 {
        class Program {
            static void Main(string[] args) {
                //double ➡ int
                //A方法:  Convert.Toint32(double) ➡ int  :四舍五入   【特殊①】
                //B方法:  (int)double ➡ 去除小数
                double a = 3.4;
                double c = 3.6;
                Console.WriteLine(
                    Convert.ToInt32(a)
                    +"\n"+ 
                    Convert.ToInt32(c)
                    +"\n"+
                    (int)a
                    +"\n"+ 
                    (int)c
                    +"\n"
                    );
                //【①】如果小数位于两个整数的正中间,则得到的整数为偶数,不为奇数
                double b = 3.5;
                double bb = 4.5;
                Console.WriteLine(
                    Convert.ToInt32(b)
                    + "\n" +
                    Convert.ToInt32(bb)
                    + "\n"
                    );
    
                //如果参数为Null,A方法对应0,B方法报错
                Console.WriteLine(
                    Convert.ToInt32(null) +"\n"
                    //+ (int)null    报错
                    
                    );
    
    
                //String ➡ int
                //A方法:int int.parse(String s);  s格式如果不对,会报错
                //B方法: bool int.Tryparse(String s ,out int a);  如果异常,a=0,并且返回false
                String rightString = "2018";
                String errorString = "liuyan";
                Console.WriteLine(
                    int.Parse(rightString)
                );
                //int.Parse(errorString); 报错
    
                int result3, result4;
                int.TryParse(rightString,out result3);
                int.TryParse(errorString,out result4);
                Console.WriteLine(result3+"\n"+result4);
    
           
    
                Console.Read();
    
            }
        }
    }
    

    打印如下:

     

     

     

     

    展开全文
  • 类型转换是什么? 不同数据类型间的转换,如:将int类型转换为string类型 为什么需要类型转换? 从控制台接收到的用户输入的内容都是string类型,如果要进行计算,就需要将接收到...double int num1 = 10; ...
  • double转int问题

    千次阅读 2018-09-03 16:15:34
    一、代码实现 ... public class TTTT { public static void main(String[] args) { double d =1.76; System.out.println((int)d); double f =1.16; System.out.println((int)f); } ...
  • double int 的问题

    2016-01-07 13:11:36
    double f_temp = 1.001 * 10000; int i_temp = f_temp; printf("%f, %d\n", f_temp, i_temp); return 0; } 为何编译运行输出: 10010.000000, 10009 编译器为: g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
  • java double类型保留位数、double转int

    万次阅读 2017-12-12 16:27:05
    1.double保留小数点后一位 DecimalFormat df = new DecimalFormat("#.0"); df.format(0.99); 同理,保留小数点后两位 DecimalFormat df = new DecimalFormat("#.00"); df.format(0.99); 同理保留小数点后零位 ...
  • Java精度丢失之String转Double转int

    千次阅读 2018-01-22 23:30:58
    看起来很简单,于是代码出来了: Double d = Double.parseDouble("0.850"); int result = (int) (d*100);随便找了两个数试了试都没问题就以为大功告成了,谁知道测试的同事告诉我0.570显示的是56而不是57,我抱着...
  • double转int精度丢失问题

    千次阅读 2015-05-10 18:19:45
    在做学校的acm题时遇到这么一个问题,多余部分已省去,问题部分为: 输入正整数n,取2的n次方的最高位。 由M=2^n,两边取以10为底的对数,logM=nlog2=y ...则pow(10,y的小数部分)即为所求...int high(long long int
  • public static void main(String[] args) { ... + (int) Math.ceil(96.1));// 97 (去掉小数凑整:不管小数是多少,都进一) System.out.println("向下取整" + (int) Math.floor(96.8));// 96 (去掉小数...
  • 保留几位小数&&double转int四舍五入

    千次阅读 2012-03-12 14:47:00
    保留1位小数使用Math方法: (float) (Math.round(x * 10) / 10.0);   double转int四舍五入: Integer.parseInt(new java.text.DecimalFormat("0").format(x));
  • floor()函数:向下取整,取小于等于这个数的最大整数 ...extension Double { func intValue() -> Int { return Int(self) } func stringIntValue() -> String { ...
  • double a=7.1,c=7.50,f=7.11; int b,d,e; b=a/0.1; d=c/0.01; e=f/0.01; printf("%d\n%d\n%d\n",b,d,e); return 0; } 为什么结果和我想象的不一样啊,b,d不正常,但是e为什么又正常了阿??? 求解阿!
  • double转int时精度不一致问题

    千次阅读 2015-05-03 19:49:32
    float和double类型的主要设计目的是为了科学计算和工程计算。它们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求...
  • java---double转int的问题

    万次阅读 2014-07-31 11:18:10
    不进行四舍五入操作: (int)x 进行四舍五入操作: Integer.parseInt(new java.text.DecimalFormat("0").format(x))
  • //自写个四舍五入函数 //其中floor()是向下取整函数 int doubleToInt(double d) { double intPart = floor(d); if ((d - intPart) >= (double)0.5) { return (intPart + 1); } else { ret...
  • c语言中double转int的舍入误差

    千次阅读 2010-09-25 23:01:00
    在C语言中,从double类型转换为int会出现舍入误差,从而导致结果错误,如下面的代码,判断n是否为“水仙花数”,当n=153时,在本机运行发生错误。调试得知,pow(remainder, i)在remainder = 5, i = 3时,得到temp为...
  • c++ string转int, doubleint,double转string

    千次阅读 2019-07-02 11:56:25
    c++ string与常用数值变量互转 写了几个字符串与数值变量互相转换的几个函数,每次用到都要上网查一堆,耽误时间,写好放到这里备用。方法有很多,这里列出来测试过能用的,其他方法慢慢添加。...2. int转...
  • 如何在Java中将double转换为int

    千次阅读 2021-03-09 10:54:46
    在本文中,我们将看到如何将double转换为int。 在Java编程中,您将有一个double原语值(例如82.14),但是要执行进一步的操作,您需要一个int值(例如82),所以让我们看看如何在Java中将double转换为int。 您可以...
  • 【整理】C++ string转int,string转double,string转long,int转string,double转string… C++开发中,经常遇到各种基本类型与string的转换,掌握本博文,便可以轻松应对C++各基本类型与string的转换(比如: int...
  • doubleint的快速转换

    千次阅读 2017-11-10 11:05:10
    doubleint的快速转换  (2014-01-19 13:39:56) 转载▼ 标签:  double   long   数值类型转换   快速   图形表示用double,显示用int,很常规的提高效率的小...
  • Java类型转换: int转double

    万次阅读 2019-02-23 16:52:10
    标题Java类型转换: int转double 由于double的范围比int数据类型大,所以当int值被赋给double时,java会自动将int值转换为double。 隐式转换:由于double数据类型的范围和内存大小都比int大,因此从int到double的...
  • java从Object类型转换成double,int类型

    万次阅读 2018-08-28 10:08:17
    import java.math.BigDecimal; BigDecimal balance =(BigDecimal)getbalance_Map.get(“balance”); balance.intValue();转int int intBalance=balance==null?0:balance.intValue();...转double...
  • java string转double转int 四舍五入

    千次阅读 2018-08-14 15:35:21
    今天在写保险公司组装报文的接口时,发现保费对不上,结果发现price这个值是58.999966后面反正就是一大串数字,然后乘以100(保险公司那边要求按分),经过了intValue(),给我截取。。。。。还是不太细心啊,哎,好...
  • NSString doubleint

    千次阅读 2012-04-23 16:53:52
    double mylat = [str doubleValue]; int myint = [str intValue];
  • c++ char*转int double

    千次阅读 2018-08-31 22:08:21
    正负皆可;靠自己勤劳的双手与智慧...上代码,可以转载。...double sqrt(double sum,int i) { double root = sum; while (i>0,i--) sum *= root; return sum; } double hexToDec(char *str) { i...
  • C++中string转doubleint

    万次阅读 2019-03-07 19:40:20
    以下是string转double的方法 #include <iostream> #include <string> #include <cstdlib> using namespace std; int main() { string s; cin >> s; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,497,395
精华内容 598,958
关键字:

double转int