分享两道笔试题

1,   给定两个int ab,不使用if-else等比较和判断运算符,请返回较大的一个数。若两数相同则返回任意一个

原博地址:https://blog.csdn.net/tc1175307496/article/details/54174610

对于给定两个int型a,b,在不使用if-else等比较和判断运算符的情况下,如何返回较大的一个数呢?

通常我们比较两个数的大小,都是通过a-b的结果来判断a与b的大小,如果是正值,则a>b,如果是负值则a<b,如果为0,则相等。

由于是int型,则在内存中占4个字节,32位,第一位是符号位,因此在没有比较运算符的情况下,我们可以通过移位来判断a-b的值的正负。

(a-b)>>31,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,因此当

a>b时,(a-b)>>31=0000 0000 0000 0000 0000 0000 0000 0000 

a<b时,(a-b)>>31 = 1111 1111 1111 1111 1111 1111 1111 1111

如果 a>b,返回a=a-0;

如果a<b,返回a = a-(a-b)

int getMax(int a, int b)   

{  

    b = a-b;     

    a -= b&(b>>31);  

    return a;   

}  

这和在不使用第三个参数的情况下,交换a、b的值有点想像,都是通过一个a,b中的一个参数来存储a,b之间的差值,然后通过这个差值与另外一个参数,就能够得到a,b两者的值,也就可以实现在没有第三个参数的情况下,实现交换。

void exchange(int a,int b)  

{  

    a = a-b;  

    b = a+b;  

    a = b-a;  

}  

2,Java小数点位数保留

原博地址:https://www.jianshu.com/p/00fff555986b

第一种方法-使用DecimalFormat类

举个例子,假如我们需要保留两位小数,我们可以这样写

DecimalFormat df = new DecimalFormat("0.00");

测试如下:

double d = 0.200;

DecimalFormat df = new DecimalFormat("0.00");

System.out.println(df.format(d));

输出结果为:
0.20

若double d=0.000;输出结果为0.00;
若double d=0;输出结果为0.00;
若double d=41.2345;输出结果为41.23;

经测试,不管double d的值为多少,最后结果都是正常的两位小数。

同理若是保留一位小数DecimalFormat df = new DecimalFormat("0.0");其他以此类推

总结:若是这种写法DecimalFormat df = new DecimalFormat("0.00"),不管传入的任何值,均保留两位小数

还有一种写法是这样:

double d = 41.123;

DecimalFormat df = new DecimalFormat("#.##");

System.out.println(df.format(d));

输出结果为:
41.12

若double d=2.00,输出结果为2;
若double d=41.001,输出结果为41;
若double d=41.010,输出结果为41.01;
若double d=0,输出结果为0;
若double d=0.200,输出结果为0.2;

总结:若是这种写法DecimalFormat df = new DecimalFormat("#.##"),则保留小数点后面不为0的两位小数,这种写法不能保证保留2为小数,但能保证最后一位数不为0

第二种方法

测试:

double d = 0.6544;

String s=String.format("%.2f",d);

System.out.println(s);

输出结果为:
0.65

若double d=0.6566,输出结果为0.66;
若double d=0,输出结果为0.00;

其中String s=String.format("%.2f",d)表示小数点后任意两位小数,其中2为表示两位小数,若需要三位小数,把2改为3即可,其他同理。

总结:这种方法不管传入的值是多少,均保留两位小数,并且符合四舍五入的规则。

第三种方法-使用BigDecimal类

测试:

double d = 1.000;

BigDecimal bd=new BigDecimal(d);

double d1=bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();

System.out.println(d1);

输入结果:1.0

若double d=0,输出结果为0.0;
若double d=1.999,输出结果为2.0;
若double d=1.89,输出结果为1.89;

总结:使用这种写法若小数点后均为零,则保留一位小数,并且有四舍五入的规则。

源码

以下为Java测试类

import java.math.BigDecimal;

import java.text.DecimalFormat;

 

public class Test {

    public static void main(String[] args) {

        double d = 1.19;

        System.out.println(formatDecimal4(d));

    }

 

    public static String formatDecimal1(double d) {

        DecimalFormat df = new DecimalFormat("0.00");

        return df.format(d);

    }

 

    public static String formatDecimal2(double d) {

        DecimalFormat df = new DecimalFormat("#.##");

        return df.format(d);

    }

    public static String formatDecimal3(double d){

        return String.format("%.2f",d);

    }

   

    public static double formatDecimal4(double d){

        BigDecimal bd=new BigDecimal(d);

        double d1=bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();

        return d1;

    }

   

}

如果只是四舍五入保留整数,可以用比较简单的方式

//取整四舍五入

double num1=3.5415;

long round = Math.round(num1);

System.out.println(round);

输出结果 4

猜你喜欢

转载自my.oschina.net/u/3512041/blog/1825240