Округлить двойные до x значащих цифр - PullRequest
59 голосов
/ 17 декабря 2008

Если у меня есть двойное число (234.004223) и т. Д., Я бы хотел округлить его до x значащих цифр в C #.

Пока что я могу найти только способы округления до x десятичных разрядов, но это просто снижает точность, если в числе есть 0.

Например, от 0,086 до одного десятичного знака становится 0,1, но я бы хотел, чтобы оно оставалось на 0,08.

Ответы [ 12 ]

0 голосов
/ 17 марта 2012

Вот что я сделал в C ++

/*
    I had this same problem I was writing a design sheet and
    the standard values were rounded. So not to give my
    values an advantage in a later comparison I need the
    number rounded, so I wrote this bit of code.

    It will round any double to a given number of significant
    figures. But I have a limited range written into the
    subroutine. This is to save time as my numbers were not
    very large or very small. But you can easily change that
    to the full double range, but it will take more time.

    Ross Mckinstray
    rmckinstray01@gmail.com
*/

#include <iostream>
#include <fstream>
#include <string>
#include <math.h>
#include <cmath>
#include <iomanip>

#using namespace std;

double round_off(double input, int places) {
    double roundA;
    double range = pow(10, 10); // This limits the range of the rounder to 10/10^10 - 10*10^10 if you want more change range;
    for (double j = 10/range; j< 10*range;) {
        if (input >= j && input < j*10){
            double figures = pow(10, places)/10;
            roundA = roundf(input/(j/figures))*(j/figures);
        }
        j = j*10;
    }
    cout << "\n in sub after loop";
    if (input <= 10/(10*10) && input >= 10*10) {
        roundA = input;
        cout << "\nDID NOT ROUND change range";
    }
    return roundA;
}

int main() {
    double number, sig_fig;

    do {
        cout << "\nEnter number ";
        cin >> number;
        cout << "\nEnter sig_fig ";
        cin >> sig_fig;
        double output = round_off(number, sig_fig);

        cout << setprecision(10);
        cout << "\n I= " << number;
        cout << "\n r= " <<output;
        cout << "\nEnter 0 as number to exit loop";
    }
    while (number != 0);

    return 0;
}

Надеюсь, я ничего не изменил, отформатировав его.

0 голосов
/ 02 мая 2011

Я только что сделал:

int integer1 = Math.Round(double you want to round, 
    significant figures you want to round to)
...