Maison > développement back-end > C++ > Comment pouvons-nous garantir l'arrondi à la hausse dans une division entière ?

Comment pouvons-nous garantir l'arrondi à la hausse dans une division entière ?

Susan Sarandon
Libérer: 2025-01-20 09:27:09
original
631 Les gens l'ont consulté

How Can We Ensure Upward Rounding in Integer Division?

Méthode fiable pour arrondir une division entière

Les opérations sur les nombres entiers peuvent être délicates, et la division ne fait pas exception. Bien que le comportement par défaut pour la division entière soit d'arrondir vers zéro, il existe des situations dans lesquelles l'arrondi est préférable. Cet article explore les méthodes de mise en œuvre de l'arrondi en division entière, aborde les lacunes des solutions existantes et propose une mise en œuvre robuste.

Énoncé du problème

Le but est d'implémenter une fonction de division entière qui arrondit toujours le résultat. La méthode existante consiste à convertir un nombre à virgule flottante double précision et à utiliser Math.Ceiling(), ce qui peut être fastidieux puisque des opérations à virgule flottante sont impliquées.

Solution

Une gestion minutieuse de l’arithmétique des nombres entiers est cruciale. En définissant soigneusement le comportement souhaité et en décomposant le problème en étapes gérables, vous pouvez concevoir des solutions plus élégantes et plus efficaces.

  1. Spécification :
  • Si le diviseur est zéro, la fonction doit lever une exception.
  • Une exception doit également être levée si le dividende est la plus petite valeur entière et que le diviseur est -1.
  • Pour une division paire, le résultat doit être le quotient entier.
  • Sinon, le résultat doit être le plus petit entier supérieur au quotient.
  1. Conception :

Pour mettre en œuvre cette spécification, nous devons calculer le quotient entier, déterminer si la division est paire et déterminer s'il faut arrondir vers le haut ou vers le bas.

  1. Code :
<code class="language-java">public static int DivRoundUp(int dividend, int divisor) {
  if (divisor == 0) throw new ArithmeticException("除以零");
  if (divisor == -1 && dividend == Integer.MIN_VALUE) throw new ArithmeticException("溢出错误");

  int roundedQuotient = dividend / divisor;
  boolean dividedEvenly = (dividend % divisor) == 0;

  if (dividedEvenly) {
    return roundedQuotient;
  } else {
    boolean roundedDown = ((divisor > 0) == (dividend > 0));
    if (roundedDown) {
      return roundedQuotient + 1;
    } else {
      return roundedQuotient;
    }
  }
}</code>
Copier après la connexion

Cette solution est conforme aux spécifications et relativement facile à comprendre. Il évite les conversions en nombres à virgule flottante double précision et la gestion complexe des erreurs, ce qui le rend à la fois efficace et robuste.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal