將數字四捨五入至某小數位, 並返回指定位數字串

java_hs 2010-03-02 11:01:01
function2()
> 將數字四捨五入至某小數位, 並返回指定位數字串
> function2(123.455,2) => 123.46
> function2(123.449,2) => 123.45
> function2(123.44,3) => 123.440
> function2(123.4455,3) => 123.446
> function2(123.4499,3) => 123.450
> function2(123.9,0) => 124
> 程式接口:
> public static double function2(double value,int decimalPlaces);
>
...全文
177 15 打赏 收藏 转发到动态 举报
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
py330316117 2010-03-03
  • 打赏
  • 举报
回复
引用 13 楼 liguang168 的回复:
引用 7 楼 tillperfect 的回复:
Java code
试试这两个方法,都可以:double one(double d,int i)
{double a= Math.pow(10, i);return Math.floor(d* a+0.5)/ a;
}double two(double d,int i)
{double a= Math.pow(10, i);return Math.ceil(d* a-0.5)/ a;
}

一楼的好长,等会儿看。
二楼的用错了运算符,^ 是异或运算符
四楼的结果也不对。

希望我这个是对的。 o(∩_∩)o
=================================
不知道你这个+ - 0.5是什么意思?
+0.5然后采用floor这不是玩弄floor吗?

这个根本就不对 你可以忽略,以上的代码只有#1是对的,其他都不符合要求
zm_hs 2010-03-03
  • 打赏
  • 举报
回复
不是都有API的吗??????????
liguang168 2010-03-03
  • 打赏
  • 举报
回复
引用 7 楼 tillperfect 的回复:
Java code
试试这两个方法,都可以:double one(double d,int i)
{double a= Math.pow(10, i);return Math.floor(d* a+0.5)/ a;
}double two(double d,int i)
{double a= Math.pow(10, i);return Math.ceil(d* a-0.5)/ a;
}

一楼的好长,等会儿看。
二楼的用错了运算符,^ 是异或运算符
四楼的结果也不对。

希望我这个是对的。 o(∩_∩)o

=================================
不知道你这个+ - 0.5是什么意思?
+0.5然后采用floor这不是玩弄floor吗?
liguang168 2010-03-03
  • 打赏
  • 举报
回复
引用 7 楼 tillperfect 的回复:
Java code
试试这两个方法,都可以:double one(double d,int i)
{double a= Math.pow(10, i);return Math.floor(d* a+0.5)/ a;
}double two(double d,int i)
{double a= Math.pow(10, i);return Math.ceil(d* a-0.5)/ a;
}

一楼的好长,等会儿看。
二楼的用错了运算符,^ 是异或运算符
四楼的结果也不对。

希望我这个是对的。 o(∩_∩)o


=======================================================
System.out.println("one:" + one(123.4455,3));
System.out.println("two:" + two(123.4455,3));
System.out.println("function2:" + function2(123.4455,3));

System.out.println("\none:" + one(123.4499,3));
System.out.println("two:" + two(123.4499,3));
System.out.println("function2:" + function2(123.4499,3));

System.out.println("\none:" + one(123.455,2));
System.out.println("two:" + two(123.455,2));
System.out.println("function2:" + function2(123.455,2));

==========》
one:123.446
two:123.445
function2:123.446

one:123.45
two:123.45
function2:123.45

one:123.46
two:123.45
function2:123.46

是不是要这样的结果?
哪个不正确?
py330316117 2010-03-02
  • 打赏
  • 举报
回复
引用 2 楼 dllzp1988 的回复:
public static double function2(double value,int decimalPlaces){
  double a=(int)(value*10^decimalPlace+0.5)/100.0;又问题这句话
  return a;
  }

应该没问题,很简单的一个小程序

这个方法不对,我试了
dllzp1988 2010-03-02
  • 打赏
  • 举报
回复
public static double function2(double value,int decimalPlaces){
double a=(int)(value*10^decimalPlace+0.5)/100.0;
return a;
}

应该没问题,很简单的一个小程序
Phoenix_99 2010-03-02
  • 打赏
  • 举报
回复

package com.nec.fastunit.common;

import java.math.BigDecimal;


public class FormatNumber {

public static String formatNumber(String number,int weishu){

// 判断字符串是否为空
if(number == null || (number.trim().length() == 0)){
// System.out.println("输入的数字为空,请输入数字");
return "";
}

// 判断字符串里有除点号之外的非数字存在
char[] strArray = number.toCharArray();

for(int i = 0; i < strArray.length; i++){
if((strArray[i] < '0' || strArray[i] > '9')&& (strArray[i] != '.' && strArray[i] != '-' && strArray[i] != 'E')){
// System.out.println("您输入的字符串中含有非法字符,请重新输入");
return number;
}else if(strArray[i] == 'E'){
if(strArray[0] == '-'){
number = number.substring(1,number.length());
String numstr = orinum(number);
numstr = "-" + numstr;
number = numstr;
}else{
number = orinum(number);
}

}
}

// 四舍五入后得数
number = String.valueOf(numz(Double.valueOf(number),weishu));

// 判断小数位数为0的情况
if(number.indexOf(".") != -1 && weishu == 0){

int pointNumber = number.indexOf(".");
String strFirst = number.substring(0,pointNumber);

// 小数点前字符串分割
strFirst = splitFirstNumber(strFirst);
return strFirst;

}


// 判断没有小数点,但小数位数要求有位数的情况
if(number.indexOf(".") == -1 && weishu != 0){

number = number + ".";
for(int i = 0; i < weishu; i++){
number = number + "0";
}

int pointNumber = number.indexOf(".");
String strFirst = number.substring(0,pointNumber);
String strLast = number.substring(pointNumber + 1,number.length());

// 小数点前字符串分割
strFirst = splitFirstNumber(strFirst);

// 小数点后字符串分割
strLast = splitLastNumber(strLast);

return strFirst + "." + strLast;

}

// 判断没有小数部分的情况
if((number.indexOf(".") == -1) && weishu == 0){

// 小数点前字符串分割
number = splitFirstNumber(number);
return number;
} else {
int pointNumber = number.indexOf(".");
String strFirst = number.substring(0,pointNumber);
String strLast = number.substring(pointNumber + 1,number.length());

// 小数位数判断
strLast = formatPoint(strLast,weishu);

// 小数点前字符串分割
strFirst = splitFirstNumber(strFirst);

// 小数点后字符串分割
strLast = splitLastNumber(strLast);


return strFirst + "." + strLast;

}
}

/**
*
* @param str 小数点前的字符串
* @return 返回小数点前的逗号分割
*/
public static String splitFirstNumber(String str){
char[] strArray = str.toCharArray();
if(strArray[0] == '-'){
StringBuffer strBuffer = new StringBuffer();
strBuffer.append(str);
strBuffer.reverse();
str = strBuffer.toString();
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i=i+3){
if(i+3 < str.length()){
String str1 = str.substring(i,i+3);
sb.append(str1);
if(i+3 == str.length() -1){
//
}else{
sb.append(",");
}
} else {
String str2 = str.substring(i,str.length());
sb.append(str2);
}
}
sb.reverse();
return sb.toString();

}else{
StringBuffer strBuffer = new StringBuffer();
strBuffer.append(str);
strBuffer.reverse();
str = strBuffer.toString();
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i=i+3){
if(i+3 < str.length()){
String str1 = str.substring(i,i+3);
sb.append(str1);
sb.append(",");
} else {
String str2 = str.substring(i,str.length());
sb.append(str2);
}
}
sb.reverse();
return sb.toString();
}
}

/**
*
* @param str 小数点后字符串
* @return 逗号分割后的字符串
*/
public static String splitLastNumber(String str){
StringBuffer sb = new StringBuffer();
for(int i = 0; i < str.length(); i=i+3){
if(i+3 < str.length()){
String str1 = str.substring(i,i+3);
sb.append(str1);
sb.append(",");
} else {
String str2 = str.substring(i,str.length());
sb.append(str2);
}
}
return sb.toString();
}

/**
*
* @param laststr 小数点后字符串
* @param bitWei 截取的字符串长度
* @return 返回小数点后应得的字符串
*/
public static String formatPoint(String laststr,int bitWei){
int n = laststr.length();
if(n < bitWei){
for(int i = 0; i < bitWei - n; i++){
laststr = laststr + "0";
}
} else {
BigDecimal bd = new BigDecimal("0." + laststr).setScale(bitWei,BigDecimal.ROUND_HALF_UP);
laststr = bd.toString();
laststr = laststr.substring(2,laststr.length());
}
return laststr;
}

// 处理科学计数法
public static String orinum(String str){
int index = str.indexOf("E");
String lstr = str.substring(index + 1, str.length());
int pindex = str.indexOf(".");
// System.out.println("pindex: " + pindex);

// 取小数点后到E之间的字符串
String midstr = str.substring(pindex + 1,index);

// 取小数点前字符
String pstr = str.substring(0,pindex);

// 判断E后数字是正还是负
Integer e = Integer.parseInt(lstr);
String nstr = null;
if(e > 0){
if(midstr.length() > e){
nstr = pstr + midstr.substring(0,e) + "." + midstr.subSequence(e, midstr.length());
}else{
nstr = pstr + midstr;
for(int i = 0; i < e - midstr.length(); i++){
nstr = nstr + "0";
}
}
}else{
if(pstr.length() > -e){
nstr = pstr.substring(0,pindex + e) + "." + pstr.substring(pindex+e,pstr.length()) + midstr;
}else{
nstr = pstr + midstr;
for(int i = 0; i < -e - pstr.length(); i++){
nstr = "0" + nstr;
}
nstr = "0." + nstr;
}
}
return nstr;
}

public static double numz(double numstr,int bitshu){
BigDecimal b = new BigDecimal(Double.toString(numstr));
String finalnum = b.setScale(bitshu, BigDecimal.ROUND_HALF_EVEN).toString();
return Double.valueOf(finalnum);
}
}


把formatNumber(String number,int weishu)改为你的接口方式即可
tianfengt04 2010-03-02
  • 打赏
  • 举报
回复
没有这么复杂, 看看BigDecimal中的方法吧!
很有帮助!!!!
dllzp1988 2010-03-02
  • 打赏
  • 举报
回复
引用 7 楼 tillperfect 的回复:
Java code
试试这两个方法,都可以:double one(double d,int i)
{double a= Math.pow(10, i);return Math.floor(d* a+0.5)/ a;
}double two(double d,int i)
{double a= Math.pow(10, i);return Math.ceil(d* a-0.5)/ a;
}

一楼的好长,等会儿看。
二楼的用错了运算符,^ 是异或运算符
四楼的结果也不对。

希望我这个是对的。 o(∩_∩)o
小弟才疏学浅,收益良多,感谢感谢
dllzp1988 2010-03-02
  • 打赏
  • 举报
回复
引用 6 楼 py330316117 的回复:
顶#1的,补充个main方法基本上就完美了
Java codepublicstaticvoid main(String args[]){double value=123.9999;
String replacestr=new Double(value).toString();
FormatNumber formatnumber=new FormatNumber();
String str=formatnumber.formatNumber(replacestr,3);
System.out.println(str);
}
小弟才疏学浅,收益良多,感谢感谢
samihyypia 2010-03-02
  • 打赏
  • 举报
回复
public static double function2(double value,int decimalPlaces){
double deciValue = Math.pow(10, decimalPlaces);
return Math.round(value * deciValue) / deciValue;
}
TillPerfect 2010-03-02
  • 打赏
  • 举报
回复

试试这两个方法,都可以:
double one(double d, int i)
{
double a = Math.pow(10, i);
return Math.floor(d * a + 0.5) / a;
}

double two(double d, int i)
{
double a = Math.pow(10, i);
return Math.ceil(d * a - 0.5) / a;
}


一楼的好长,等会儿看。
二楼的用错了运算符,^ 是异或运算符
四楼的结果也不对。

希望我这个是对的。 o(∩_∩)o
py330316117 2010-03-02
  • 打赏
  • 举报
回复
顶#1的,补充个main方法基本上就完美了
public static void main(String args[]){
double value=123.9999;
String replacestr=new Double(value).toString();
FormatNumber formatnumber=new FormatNumber();
String str=formatnumber.formatNumber(replacestr, 3);
System.out.println(str);
}
zliuzz 2010-03-02
  • 打赏
  • 举报
回复
恩 10的N次方应该是上面那样
liguang168 2010-03-02
  • 打赏
  • 举报
回复
看看这样是不是可以达到你的要求:

=================================================
public static double function2(double value,int decimalPlaces){
double deciValue = Math.pow(10, decimalPlaces);
return Math.ceil(value * deciValue) / deciValue;
}
相关推荐

62,568

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告