Одно решение состоит в том, чтобы просто сохранить все числа как рациональные числа во-первых. Существуют библиотеки для арифметики рационального числа (например, GMP). При использовании языка OO можно быть в состоянии просто использовать библиотеку классов рационального числа для замены класса числа.
Финансовые программы, среди других, использовали бы такое решение быть в состоянии сделать точные вычисления и точность заповедника, которая может быть потеряна с помощью простого плавания.
, Конечно, это будет намного медленнее, таким образом, это не сможет быть практично для Вас. Зависит от того, сколько вычислений необходимо сделать, и насколько важный точность для Вас.
a = rational(1);
b = rational(3);
c = a / b;
print (c.asFraction) ---> "1/3"
print (c.asFloat) ----> "0.333333"
StyleCop: Как игнорировать сгенерированный код
Изменить: вот заголовок, который я использую в сгенерированных грамматиках для ANTLR. Фактически это тело шаблона StringTemplate, поэтому две записи \>
фактически просто экранированы метками >
. Помимо тега
и атрибута [GeneratedCode]
, нам все же пришлось отключить некоторые предупреждения, появляющиеся во время анализа кода.
//------------------------------------------------------------------------------
// \<auto-generated>
// This code was generated by a tool.
// ANTLR Version: ANTLRVersion
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// \</auto-generated>
//------------------------------------------------------------------------------
// $ANTLR <ANTLRVersion> <fileName>
// The variable 'variable' is assigned but its value is never used.
#pragma warning disable 219
// Unreachable code detected.
#pragma warning disable 162
// Missing XML comment for publicly visible type or member 'Type_or_Member'
#pragma warning disable 1591
// CLS compliance checking will not be performed on 'type' because it is not visible from outside this assembly.
#pragma warning disable 3019
// 'type' does not need a CLSCompliant attribute because the assembly does not have a CLSCompliant attribute.
#pragma warning disable 3021
[System.CodeDom.Compiler.GeneratedCode("ANTLR", "<ANTLRVersion>")]
[System.CLSCompliant(false)]
public class ...