关于C++ 标准输入输出 及 精度控制

摘自牛客网一道题,如下:

给定两个数R和n,输出R的n次方,其中0.0<R<99.999, 0<n<=25
输入描述:
多组测试用例,请参考例题的输入处理 输入每行一个浮点数 R 其中0.0 < R <99.999, 一个整数 n 其中0 < n <=25
输出描述:
输出R的n次方
输入例子1:
95.123 12 0.1 1
输出例子1:
548815620517731830194541.899025343415715973535967221869852721 0.1
我给出的代码如下:
 1 #include <iostream>
 2 #include <stdlib.h>
 3 #include <cmath>
 4 #include <iomanip>
 5 
 6 using namespace std;
 7 int main(){
 8     double base_num,pow_num;
 9     cout<<"Please input:"<<endl;
10 
11     while(cin.get()!='\n'){   //对回车符做输入检查
12     cin.unget();
13     cin>>base_num; 
14     cin>>pow_num;
15     if(base_num>=99.999 || base_num<=0.0 || pow_num<=0.0 || pow_num>25.0)
16         cout<<"error   ";
17     else {cout<<fixed<<setprecision(30)<<pow(base_num,pow_num)<<"   ";}    
18     if(cin.good()!=true){break;} //非法检查,比如输出一些特殊字符时可以避免死循环
19     }
20     cout<<endl;
21     return 0;
22 }

但是问题是精度不符:

正确答案:

 1 import java.math.BigDecimal;
 2 import java.util.Scanner;
 3 
 4 public class Main {
 5     public static void main(String[] args) {
 6         String r;
 7         int n;
 8         String s;
 9         Scanner sc = new Scanner(System.in);
10         while(sc.hasNext()){
11             r = sc.next(); //用string来存储,因为double和float都是不能准确的表示小数的,只是以概数来表示
12             n = sc.nextInt();
13             BigDecimal d = new BigDecimal(r);
14             BigDecimal ans = new BigDecimal(r);
15             for(int i=1;i<n;i++){
16                 ans = ans.multiply(d);
17             }
18             s= ans.stripTrailingZeros().toPlainString(); // 去除不必要的零,转换为字符串,防止科学记数法
19             System.out.println(s);
20         }
21 
22     }
23 }

用到BigDecimal类,用字符串来实现高精度表示和计算,转化为字符串打印。学到了。。

 

posted @ 2018-08-31 20:08  mangoCzp  阅读(382)  评论(0编辑  收藏  举报